Avatar billede anne_25 Nybegynder
11. december 2003 - 01:14 Der er 23 kommentarer og
1 løsning

Hvordan sætter jeg farve på en celle i JTable?

Som det kan ses har jeg prøvet med DefaultTableCellRenderer i forbindelse med at farve enkelte celler i mit JTable. Jeg kan ikke finde ud af at få knyttet farven (som laves i klassen Cellefarver) til.
Vh. anne

------------GUIStregliste-------------
import javax.swing.*;
import java.awt.*;
import java.lang.reflect.Array;
import java.util.*;
import java.awt.Color;

public class GUIStregliste extends JPanel {

    private MyTableModel table;
    private JTable _Table = new JTable();
    private Component celle;
    JScrollPane scrollPaneMedData;
    Controller _controller = new Controller();
    String[][] data;
    private ArrayList navneliste;
    private int[][] stregliste;
    Cellefarver _cellefarver = new Cellefarver();

    public GUIStregliste() {

        navneliste = _controller.getNavneliste();
        stregliste = _controller.getStregliste();

        String[] columnNames =
            { "Navn", "Torsdag", "Fredag", "Lørdag", "Ialt" };
        data = new String[navneliste.size()][5];

        for (int i = 0; i < navneliste.size(); i++) {

            ArrayList bartender = (ArrayList) navneliste.get(i);
            String navn = (String) bartender.get(1);
            data[i][0] = navn;
           

            String antal1 = Integer.toString(stregliste[i][0]);
            data[i][1] = antal1;
            String antal2 = Integer.toString(stregliste[i][1]);
            data[i][2] = antal2;
            String antal3 = Integer.toString(stregliste[i][2]);
            data[i][3] = antal3;

            data[i][4] =
                Integer.toString(
                    Integer.parseInt(antal1)
                        + Integer.parseInt(antal2)
                        + Integer.parseInt(antal3));
//            data [i][0]= {navn, antal1, antal2, antal3, antal4, Color.blue};
        }

        table = new MyTableModel(data, columnNames);
        JTable _table = new JTable(table);

        for (int i = 0; i < navneliste.size(); i++) {
            ArrayList bartender = (ArrayList) navneliste.get(i);
            String type = (String) bartender.get(0);

            _table.setDefaultRenderer(JLabel.class, new Cellefarver());

            celle = _cellefarver.getTableCellfarver(
                _table,
                type,
                false,
                false,
                i + 1,
                0);
            System.out.println(celle.getBackground());
        }

        scrollPaneMedData = new JScrollPane(_table);
        _table.setRowSelectionAllowed(false);
        _table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    }
    public JScrollPane getGUIStregliste() {
        return scrollPaneMedData;
    }
}


--------------Cellefarver------------------

import javax.swing.table.*;
import java.awt.*;
import javax.swing.*;

public class Cellefarver extends DefaultTableCellRenderer {

    public Component getTableCellfarver(
        JTable table,
        String value,
        boolean isSelected,
        boolean hasFocus,
        int row,
        int column) {
                Component celle =
            super.getTableCellRendererComponent(
                table,
                value,
                isSelected,
                hasFocus,
                row,
                column);

        if (value.equals("chefbartender")) {
            System.out.println("Grøn");
            celle.setBackground(Color.green);
        } else if (value.equals("dreng")) {
            System.out.println("Blå");
            celle.setBackground(Color.blue);
        } else if (value.equals("pige")) {
            System.out.println("Pink");
            celle.setBackground(Color.pink);

        }
        return celle;
    }
}
Avatar billede mikkelbm Nybegynder
11. december 2003 - 08:15 #2
Avatar billede anne_25 Nybegynder
11. december 2003 - 11:28 #3
det er fra start af, at mine celler skal have tildelt en farve, ikke kun når man kører musen hen over, eller når der bliver klikket i cellen.
Avatar billede _carsten Nybegynder
11. december 2003 - 11:35 #4
Prøv at erstatte din kode med nedenstående

I GUIStregliste:
_table.setDefaultRenderer(Color.class, new Cellefarver());


I CelleFarver:
      if (value.equals("chefbartender")) {
            System.out.println("Grøn");
            setBackground(Color.green);
        } else if (value.equals("dreng")) {
            System.out.println("Blå");
            setBackground(Color.blue);
        } else if (value.equals("pige")) {
            System.out.println("Pink");
            setBackground(Color.pink);

        }
        return this;
Avatar billede _carsten Nybegynder
11. december 2003 - 11:46 #5
Hov du skal vist også lige have denne med i din CelleFarver

public boolean isOpague(){
    return true;
}
Avatar billede anne_25 Nybegynder
11. december 2003 - 12:28 #6
Tak for rådet, men det virker stadig ikke. Jeg tror at problemet ligger der hvor det returnerede (celle/this) skal addes til mit JTable ?! Hvad gør man med det returnerede?
Avatar billede _carsten Nybegynder
11. december 2003 - 12:35 #7
Aller først - for du udskrevet dine farve statements Blå, Grån og pink  ?
Avatar billede anne_25 Nybegynder
11. december 2003 - 12:35 #8
Ja.
Avatar billede Rasmus Lund Nybegynder
11. december 2003 - 12:41 #9
Spørg Henrik!
Avatar billede _carsten Nybegynder
11. december 2003 - 12:44 #10
Når du bruger: _table.setDefaultRenderer(Color.class, new Cellefarver());
er det Cellefarver som styrer hvordan cellen skal gentegnes og egentlig skulle der ikke være behov for mere.

Prøv at pille nedenstående ud - jeg kan ikke se behovet for det.
          Component celle =
            super.getTableCellRendererComponent(
                table,
                value,
                isSelected,
                hasFocus,
                row,
                column);


Fjern også:
public boolean isOpague(){
    return true;
}

og erstat det med:

        setOpague(true);

        if (value.equals("chefbartender")) {
            System.out.println("Grøn");
            setBackground(Color.green);
        } else if (value.equals("dreng")) {
            System.out.println("Blå");
            setBackground(Color.blue);
        } else if (value.equals("pige")) {
            System.out.println("Pink");
            setBackground(Color.pink);

        }
        return this;

Det må være fordi opague er false, når dine statements bliver udskrevet!
Avatar billede _carsten Nybegynder
11. december 2003 - 15:02 #11
Jeg ser lige, at jeg har skrevet setOpague() med *g* i stedet for *q*

Sådan skal den se ud - SORRY :(

public boolean isOpaque(){
    return true;
}
Avatar billede anne_25 Nybegynder
11. december 2003 - 15:37 #12
Endnu engang tak for rådet men...
Jeg har rettet fejlen, jeg kan udskrive de rigtige farver i consollen, men der er stadig ingen farver på cellerne i JTable?! Jeg har også prøvet at lave cellerne om til buttons uden held :(
Avatar billede _carsten Nybegynder
11. december 2003 - 21:54 #13
Det er simpelthen for sindssygt, jeg har stirret mig totalt blind på din kode - den er næsten perfekt, med undtagelse af en lille afgørende detalje

Brug din egen kode som den er, men
Ret:
_table.setDefaultRenderer(JLabel.class, new Cellefarver());

Til:
_table.setDefaultRenderer( type, new Cellefarver());

Så spinder den som en kat !!
Avatar billede anne_25 Nybegynder
11. december 2003 - 22:16 #14
Det er virkelig fedt at du gider kigge på det, men hos mig virker det stadig ikke. Metoden _table.setDefaultRenderer( type, new Cellefarver()); tager ikke et String argument(type) kun et class argument? Hvordan fik du det til at spinde?
Avatar billede _carsten Nybegynder
11. december 2003 - 22:18 #15
Det er vist ved at være tid til at jeg går i seng !

_table.setDefaultRenderer( String.class, new Cellefarver());
Avatar billede anne_25 Nybegynder
11. december 2003 - 22:23 #16
ja ingen syntax fejl, men stadig ingen farver når jeg kører...ARG! har du snart flere gode forslag?
Avatar billede _carsten Nybegynder
11. december 2003 - 22:26 #17
Du bruger din gamle kode og ikke de tidligere rettelser jeg har foreslået ??
Avatar billede anne_25 Nybegynder
11. december 2003 - 22:31 #18
Ja det mener jeg. Jeg returnerer stadig celle i Cellefarver, har droppet setOpaque metoden, og indsat den nyeste rettelse _table.setDefaultRenderer( String.class, new Cellefarver()); Hvor går jeg galt?
Avatar billede _carsten Nybegynder
11. december 2003 - 22:39 #19
Jeg kan ikke se at du gør noget galt - jeg gider ikke mere i dag,
men laver et lille eksempel i morgen du kan kigge på.

Men check lige din ArrayList, at navne er identiske, store/små bogstaver mellemrum etc.
Avatar billede anne_25 Nybegynder
11. december 2003 - 22:40 #20
Okay det gør jeg. 1000 tak..
Avatar billede _carsten Nybegynder
11. december 2003 - 22:57 #21
Du kunne jo også lige prøve: 

_table.setDefaultRenderer(_table.getColumnClass(i), new Cellefarver());

Sådan gør jeg faktisk selv.
Avatar billede anne_25 Nybegynder
11. december 2003 - 23:35 #22
Jeg tror at cellerne bliver farvet rigtigt nok i Cellefarver. Men jeg har en ide om at problemet ligger i GUIStreglist. I metoden     scrollPaneMedData = new JScrollPane(_table); bliver de farvede celler vel ikke sendt med? Udskifter jeg _table med celle, får jeg nemlig 1 stor lyserød celle lavet. Så de rigtige farver bliver tildelt de rigtige celler, men de kommer ikke med i det JTable(_table) som hives over i det scrollPane(scrollPaneMedData), som igen addes til det Panel(VagtplanPanel) der skal vises?! Her er lige endnu en klasse(!), ved ikke om det hjælper?

-------------------VagtplanPanel-----------------
import java.awt.*;
import javax.swing.*;
public class VagtplanPanel extends JFrame {
   
    GUIPraefFelt praeffelt = new GUIPraefFelt();
    GUIStregliste stregliste = new GUIStregliste();
    GUIVagtliste vagtliste = new GUIVagtliste();

    JPanel vagtPlanPanel = new JPanel();

    /** Laver et JPanel til vagtplans gui'en og tilføjer en JLabel m. teksten "total a-style :-)"
    *
    *
    */
    public JPanel createVagtplan() {

        vagtPlanPanel.setLayout(new GridLayout(1, 3, 5, 10));
        vagtPlanPanel.add(vagtliste.getGUIVagtliste());
        vagtPlanPanel.add(stregliste.getGUIStregliste());
        vagtPlanPanel.add(praeffelt.getGUIPraefFelt());
       
        return vagtPlanPanel;
    }
}
Avatar billede _carsten Nybegynder
12. december 2003 - 08:16 #23
Har du følgende metode i klassen:  MyTableModel  ???

    public Class getColumnClass(int column){
        return String.class; 
    }

    Normalt ville ovenstående metode returnere:  data[0][column].getClass();
Avatar billede _carsten Nybegynder
12. december 2003 - 21:13 #24
Jeg ved ikke om du har fået løst dit problem, under alle omstændigheder lovede jeg dig et eksempel som kunne køre - det kommer her, håber det hjælper dig på vej



import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;

public class TableTest extends javax.swing.JFrame {
   
    public TableTest() {
        initComponents();
    }
   
    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {"chefbartender", "dreng", "pige", null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        });
        for(int i = 0; i < jTable1.getColumnCount(); i++)
        jTable1.setDefaultRenderer( jTable1.getColumnClass(i), new MyTableCellRenderer());

        jScrollPane1.setViewportView(jTable1);

        jPanel1.add(jScrollPane1);

        getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

        pack();
    }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
   
    public static void main(String args[]) {
        new TableTest().show();
    }

    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;

   
   
   
    class MyTableCellRenderer extends DefaultTableCellRenderer {
   
    public MyTableCellRenderer() {
    }
   
    public java.awt.Component getTableCellRendererComponent(JTable table,
                                                            Object value,
                                                            boolean isSelected,
                                                            boolean hasFocus,
                                                            int row,
                                                            int column) {
                                                               
   
        Component celle = super.getTableCellRendererComponent
            (table, value, isSelected, hasFocus, row, column);
           
            if (value == null)
                return celle;
       
            if (value.equals("chefbartender")) {
                System.out.println("Grøn");
                celle.setBackground(Color.green);
            } else if (value.equals("dreng")) {
                System.out.println("Blå");
                celle.setBackground(Color.blue);
            } else if (value.equals("pige")) {
                System.out.println("Pink");
                celle.setBackground(Color.pink);
        }

        return celle;
    }
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester