tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
11
ZUGRIFFE
851
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    chrsbo chrsbo ist offline Rookie
    Registriert seit
    Nov 2011
    Beiträge
    6
    Hi,

    ich bin jetzt seit Stunden auf der Suche nach meinem Problem, weiß dass das viele haben und scheinbar die Lösungen auch im Netz stehen. Ich bin aber nicht clever genug sie für mein Beispiel anzuwenden.

    Also ich lese Daten aus einer Datenbank aus und schreibe die in ein JTable. Unteranderem gibt es dort auch true/false werte. Diese werden erkannt und auch als Checkboxen dargestellt. Ich möchte nun eine ZEILE, die den Checkboxwert FALSE hat rot färben.

    Jetzt habe ich das Problem, dass die gesamte(!!) Zeile zwar gefärbt ist, ich aber keine Checkboxen, sondern nur Text angezeigt bekomm. Wie muss ich die CellRenderer ändern?

    Code :
    1
    2
    
    myTable.setDefaultRenderer(Object.class, myTableCellrenderer);
    myTable.setDefaultRenderer(Boolean.class, checkboxRenderer);

    Hier der Code des myTableCellRenderer:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    public class MyTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
     
        private static final int VALIDATION_COLUMN = 6;
     
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                boolean hasFocus, int row, int column) {
     
            Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
            String status = table.getModel().getValueAt(row, VALIDATION_COLUMN).toString();
     
            if (status.equals("false")) {
                
                comp.setBackground(Color.RED);            
            }  
            else
                comp.setBackground(Color.BLUE);
            
            return comp;
        }
    }

    Hier der Code des checkBoxRenderer:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    public class CheckBoxRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
     
        private static final int VALIDATION_COLUMN = 6;
     
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                boolean hasFocus, int row, int column) {
     
            Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
            String status = table.getModel().getValueAt(row, VALIDATION_COLUMN).toString();
     
            if (status.equals("false")) {
                JCheckBox checkbox = new JCheckBox();
                comp.setBackground(Color.RED);            
            }  
            else
                comp.setBackground(Color.BLUE);
            
            return comp;
        }
    }

    Ich entschuldige mich ernsthaft für die Redundanz des Themas, aber ich bekomm einfach keinei Lösung gefunden...

    Viel Grüße
    Christian
     

  2. #2
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Hi und willkommen bei tutorials.de ,
    ich habe eine Lösung gefunden. Als erstes musst du deinem TableModel sagen, welche Class er bei welcher Column zu erwarten hat:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    model = new DefaultTableModel(data, columnNames) {
       /* (non-Javadoc)
       * @see javax.swing.table.AbstractTableModel#getColumnClass(int)
       */
       @Override
       public Class<?> getColumnClass(int columnIndex) {
          return getValueAt(0, columnIndex).getClass();
       }
    };

    An deinem MyTableCellRenderer musst du nichts ändern. Ich habe allerdings noch die Änderung rein genommen, den Wert in einen Boolean zu verwandeln. Ist einfach besser zu verstehen und geht im Programm schneller.
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    public class MyTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                boolean hasFocus, int row, int column) {
            Component comp = super.getTableCellRendererComponent(
                    table, value, isSelected, hasFocus, row, column
            );
     
            boolean status = Boolean.parseBoolean(table.getModel().getValueAt(row, 1).toString());
            if (status) {
                comp.setBackground(Color.RED);            
            } else {
                comp.setBackground(Color.BLUE);
            }
            return comp;
        }
    }

    So, nun fehlt noch der CheckBoxRenderer. Diesen Renderer darfst du nicht von DefaultTableCellRenderer erben lassen, sondern von JCheckBox. Damit die Zeile dann komplett aktuellisiert wird, musst du dann nur noch table.repaint() aufrufen und fertig.
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    public class CheckBoxRenderer extends JCheckBox implements TableCellRenderer {
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                boolean hasFocus, int row, int column) {
            boolean status = Boolean.parseBoolean(table.getModel().getValueAt(row, 1).toString());
            setSelected(status);
            if (status) {
                setBackground(Color.RED);            
            } else {
                setBackground(Color.BLUE);
            }
            table.repaint();
            return this;
        }
    }

    Ich hoffe das war verstendlich erklärt. Falls du noch Fragen haben solltest, nur zu.

    ps.: Bitte verwende in Zukunft die [java]...[/java]-CodeTags, damit die Javasyntax gehighlited wird. Danke

    Gruß

    Fabio
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  3. #3
    chrsbo chrsbo ist offline Rookie
    Registriert seit
    Nov 2011
    Beiträge
    6
    Hi,

    danke für die Antwort, aber ich habe leider immernoch das Problem, dass die Zelle in der sich die Checkbox befindet nicht gefärbt ist. (Die anderen Zellen der Zeile sind richtig gefärbt.)

    Außerdem tritt bei

    Code java:
    1
    2
    
    orderTable.setDefaultRenderer(Object.class, myTableCellrenderer);
    orderTable.setDefaultRenderer(Boolean.class, checkboxRenderer);

    Das Problem auf, dass die Checkboxen nicht den Wert aus der Datenbank übernehmen.


    Bei
    Code java:
    1
    2
    
    orderTable.setDefaultRenderer(Object.class, myTableCellrenderer);
    //orderTable.setDefaultRenderer(Boolean.class, checkboxRenderer);

    Werden die checkboxen richtig aktiviert gezeigt, auch die Zellen der Zeile sind richtig gefärbt, nur eben die Zelle der Checkbox nicht.

    Idee?


    PS: Danke für das nette Wilkommen heißen =)
     

  4. #4
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Das kommt darauf an, wie dein Code nun aussieht. So ohne weiteres kann ich das nicht sagen. Da würde ich auch nur in der Luft rumstochern.
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  5. #5
    chrsbo chrsbo ist offline Rookie
    Registriert seit
    Nov 2011
    Beiträge
    6
    Hi also mein Code sieht nun wie folgt aus:

    TableModel:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    
    public class MyTableModel extends AbstractTableModel {
     
        private String[] columnNames = {"ID", "Name", "Größe", "Preis", "Anzahl", "Tischnummer", "Abgefertigt"};
        private Object[][] data;
     
        public void setData(ArrayList<Order> allOrders) {
            data = new Object[allOrders.size()][7];
     
            for (int i = 0; i < allOrders.size(); i++) {
                for (int y = 0; y < 7; y++) {
                    data[i][0] = allOrders.get(i).getID();
                    data[i][1] = allOrders.get(i).getName();
                    data[i][2] = allOrders.get(i).getGroesse();
                    data[i][3] = allOrders.get(i).getPreis();
                    data[i][4] = allOrders.get(i).getNumberOfDrink();
                    data[i][5] = allOrders.get(i).getTableNumber();
                    data[i][6] = allOrders.get(i).getStatus();
                }
     
            }
            System.out.println("");
        }
        
     
        public Object getValueAt(int row, int col) {
            return data[row][col];
        }
     
        public int getColumnCount() {
            return columnNames.length;
        }
     
        public int getRowCount() {
            return data.length;
        }
     
        public String getColumnName(int col) {
            return columnNames[col];
        }
     
        public boolean isCellEditable(int row, int col) {
            //Note that the data/cell address is constant,
            //no matter where the cell appears onscreen.
            if (col == 6) {
                return true;
            } else {
                return false;
            }
        }
     
        public void setValueAt(Object value, int row, int col) {
     
            if (value.toString().equals("true")) {
                data[row][col] = value;
                fireTableCellUpdated(row, col);
            }
     
        }
     
        public Class<?> getColumnClass(int col) {
            return getValueAt(0, col).getClass();
        }
     
    }

    TabelCellRenderer
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    public class MyTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
     
        private static final int VALIDATION_COLUMN = 6;
     
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                boolean hasFocus, int row, int column) {
     
            Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
            Boolean status = Boolean.parseBoolean(table.getModel().getValueAt(row, VALIDATION_COLUMN).toString());
     
     
            if (!status) {
     
                comp.setBackground(Color.RED);
            } else {
                comp.setBackground(Color.BLUE);
            }
     
            return comp;
        }
     
    }

    CheckBoxRenderer
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    public class CheckBoxRenderer extends JCheckBox implements TableCellRenderer {
     
        private static final int VALIDATION_COLUMN = 6;
     
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                boolean hasFocus, int row, int column) {
     
            Boolean status = Boolean.parseBoolean(table.getModel().getValueAt(row, VALIDATION_COLUMN).toString());
     
            if (!status) {
                setBackground(Color.RED);
            } else {
                setBackground(Color.BLUE);
            }
            
            table.repaint();
            return this;
        }
        
     
    }

    Beste Grüße
    Christian
     

  6. #6
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Hi,
    also ich würde mal vermuten, dass das Problem an dem AbstractTableModel liegt. Versuch es mal mit dem DefaultTableModel. Da hast du auch nicht ganz so viel Tipparbeit.
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    model = new DefaultTableModel(data, columnNames) {
                /* (non-Javadoc)
                 * @see javax.swing.table.DefaultTableModel#isCellEditable(int, int)
                 */
                @Override
                public boolean isCellEditable(int row, int column) {
                    if(column == 6) {
                        return true;
                    }
                    return false;
                }
                
                /* (non-Javadoc)
                 * @see javax.swing.table.AbstractTableModel#getColumnClass(int)
                 */
                @Override
                public Class<?> getColumnClass(int columnIndex) {
                    return getValueAt(0, columnIndex).getClass();
                }
            };

    Dann sollte es auch funktionieren. Das tut es zumindest bei mir.

    Gruß

    Fabio
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  7. #7
    chrsbo chrsbo ist offline Rookie
    Registriert seit
    Nov 2011
    Beiträge
    6
    Ok, habe jetzt AbstractTableModel durch DefaultTableModel ausgetauscht und bekomme jetzt folgende Fehlermeldung:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at clickndrinkprovider.MyTableModel.getRowCount(MyTableModel.java:47)
        at javax.swing.table.DefaultTableModel.setDataVector(DefaultTableModel.java:207)
        at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:107)
        at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:89)
        at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:69)
        at clickndrinkprovider.MyTableModel.<init>(MyTableModel.java:14)
        at clickndrinkprovider.NewJFrame.<init>(NewJFrame.java:28)
        at clickndrinkprovider.NewJFrame$4.run(NewJFrame.java:301)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
        at java.awt.EventQueue.access$000(EventQueue.java:84)
        at java.awt.EventQueue$1.run(EventQueue.java:602)
        at java.awt.EventQueue$1.run(EventQueue.java:600)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
    BUILD SUCCESSFUL (total time: 1 second)

    Mit wird meine GUI nicht angezeigt, hat wohl Probleme beim Daten holen?
    Der Rest vom code ist exakt gleich geblieben!

    Viele Grüße
    Christian
     

  8. #8
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Das sieht ganz danach aus, dass du einen Wert zurückgeben lassen willst, der nicht vorhanden ist. Deshalb die NullPointerException.
    Hast du das DefaultTableModel deinem MyTableModel extended? Oder hast du es so geschrieben wie ich?
    Falls du es extended hast, schreib es bitte mal so wie ich es geschreiben habe. Und dann auch nur die zwei Methoden überschreiben, die ich auch überschrieben habe.
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  9. #9
    chrsbo chrsbo ist offline Rookie
    Registriert seit
    Nov 2011
    Beiträge
    6
    Es müsste doch auch funktionieren, wenn ich das DefaultTableModel in meiner eigenen Klasse extende? Will schon das eigene TableModel in einer eigenen Klasse haben....
     

  10. #10
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Klar kannst du auch. Aber dann überschreib mal nur die zwei Methoden, die ich auch überschrieben habe.
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  11. #11
    chrsbo chrsbo ist offline Rookie
    Registriert seit
    Nov 2011
    Beiträge
    6
    Aber wie setzte ich dann die daten, wenn ich nicht auch setData überschrieben kann?

    Bzw. wir übergebe ich Daten in ein DefaultTableModell, bisher mache ich das mit einem 2-Dimensionalen Array.
    Geändert von chrsbo (14.11.11 um 17:10 Uhr)
     

  12. #12
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Ah ok, da liegt also das eigentliche Problem begraben.

    Du kannst dein 'Object[][] data' und dein 'String[] columnNames' an den Konstruktor von DefaultTableModel übergeben. Sprich:
    Code java:
    1
    
    DefaultTableModel model = new DefaultTableModel(data, columnNames);
    Wenn du nachträglich noch Daten hinzufügen willst, kannst du mit der Methode 'model.addRow(Object[])' eine Zeile oder 'model.addColumn(...)' eine Spalte hinzufügen.
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

Ähnliche Themen

  1. Wie Item Listener zu JCheckBox(in JTable) hinzufügen?
    Von Fastkiller im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 22.04.08, 23:46
  2. JCheckBox in JTable
    Von Moltar im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 08.05.07, 08:25
  3. Problem mit JCheckBox in JTable
    Von nhocgirl0105 im Forum Java
    Antworten: 1
    Letzter Beitrag: 15.04.07, 21:29
  4. JCheckBox in JTable
    Von fastfiler im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 23.11.05, 00:48
  5. Dyn. jTable inkl. JCheckbox
    Von hankenberge im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 4
    Letzter Beitrag: 09.09.04, 13:29

Stichworte