# in JTable CheckBox und ComboBox anzeigen lassen



## nathaniells freak (13. Februar 2008)

Hallo Jungs ich versuche einer JTable eine Methode bei zubringen mit der man ein java.awt.Object[] übergibt worin TextFields, Comboxen und Checkboxen enthalten sind in dem Feld. Dann dieses Feld so zu benutzen das man mit dieser Funktion den Inhalt setzen kann, quasi Welche Spalte enthält welche Components (CHeckbox, ComboBox, TextField). Im Moment zeigt er nur den Klassennamen mit dem den Steuerparametern an in der Zelle. Außer bei den Checkboxen denn da zeigt er wie schon erwähnt nur false oder true an.

Dabei will ich dann auch das wenn eine ComboBox gesetzt wird diese auch auf das ComboBoxModell zugreifen kann. Bis hier hin funktioniert auch alles. Der Witz ist nur das er mit die ComboBox nicht ausklappt und bei der CheckBox das kästchen nicht anzeigt sondern nur true oder false in das Feld schreibt.

Hier der Quellcode der MyTable Klasse:


```
package MyControlElements;

import java.util.Vector;
import javax.swing.table.TableCellRenderer;

public class MyTable extends javax.swing.JTable 
                     implements MySteuerelementInterface {
    
    private boolean lesenBerechtigung;
    private boolean schreibenBerechtigung;
    private int komponentennr;
    private String name;
    private Vector<Boolean[]> editable;
    private Vector<java.awt.Color[]> backgroundcolor;
    private int col;
    private java.lang.Object ObjectRow[];
    

    public MyTable(int COL) {
        this.col = COL;
        this.editable = new Vector<Boolean[]>();
        this.editable.trimToSize();
        this.backgroundcolor = new Vector<java.awt.Color[]>();
        this.backgroundcolor.trimToSize();
        this.ObjectRow = null;
    }
    
    public void renderRow(int ROW) {
        for(int i = 0;i < this.getColumnCount();i++) {
            this.prepareRenderer(this.getCellRenderer(ROW,i),ROW,i);
        }
    }
    
    public void renderRow(int vonROW, int bisROW) {
        for(int v = vonROW;v <= bisROW;v++) {
            for(int i = 0;i < this.getColumnCount();i++) {
                this.prepareRenderer(this.getCellRenderer(v,i),v,i);
            }
        }
    }
   
    @Override
    public java.awt.Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int vColIndex) {
        java.awt.Component c = super.prepareRenderer(renderer, rowIndex, vColIndex);
        int cols = this.getModel().getColumnCount();    
        if (rowIndex % 2 == 0 && !isCellSelected(rowIndex, vColIndex)) {
            if(rowIndex == this.backgroundcolor.size()) {
                // zeile existiert noch nicht in vector background
                // anlegen des farbvectors
                java.awt.Color tmp[] = new java.awt.Color[cols];                
                for(int i = 0;i < cols;i++) {
                    tmp[i] = new java.awt.Color(198,230,236);
                }
                this.backgroundcolor.add(tmp);
                this.backgroundcolor.trimToSize();
                c.setBackground(this.backgroundcolor.get(rowIndex)[vColIndex]);                
            }
            else {
               c.setBackground(this.backgroundcolor.get(rowIndex)[vColIndex]);
            }
        } else {
            if (rowIndex % 2 == 1 && !isCellSelected(rowIndex, vColIndex)) {
                if(rowIndex == this.backgroundcolor.size()) {
                    // zeile existiert noch nicht in vector background
                    // anlegen des farbvectors
                    java.awt.Color tmp[] = new java.awt.Color[cols];
                    for(int i = 0;i < cols;i++) {
                        tmp[i] = new java.awt.Color(134,209,164);
                    }
                    this.backgroundcolor.add(tmp);
                    this.backgroundcolor.trimToSize();
                    c.setBackground(this.backgroundcolor.get(rowIndex)[vColIndex]);
                }
                else {
                    c.setBackground(this.backgroundcolor.get(rowIndex)[vColIndex]);
                }               
            } else {
                // If not shaded, match the table's background
                c.setBackground(new java.awt.Color(224,172,129));
            }
        }
        return c; 
    }
    
    @Override
    public boolean isCellEditable(int ROW, int COL) {
        System.out.println("ROW = " + ROW);
        System.out.println("COL = " + COL);
        Boolean tmp[] = this.editable.get(ROW);        
        return tmp[COL].booleanValue();
    }
    
    public boolean getSchreibenBerechtigung() {
        return this.schreibenBerechtigung;
    }
    
    public boolean getLesenBerechtigung() {
        return this.schreibenBerechtigung;
    }
    
    public int getKomponentenNummer() {
        return this.komponentennr;
    }    
    
    public String getKomponentenName() {
        return this.name;
    }
    
    public void setSchreibenBerechtigung(boolean BERECHTIGUNG) {
        this.schreibenBerechtigung = BERECHTIGUNG;
    }
    
    public void setLesenBerechtigung(boolean BERECHTIGUNG) {
        this.lesenBerechtigung = BERECHTIGUNG;
    } 
    
    public void setKomponentenNummer(int NR) {
        this.komponentennr = NR;
    }
    
    public void setKomponentenName(String NAME) {
        this.name = NAME;
    }
    
    public void setKopfzeile(String HEADER[], int SPALTEN) {      
        javax.swing.table.DefaultTableModel x = new javax.swing.table.DefaultTableModel(0,SPALTEN);
        this.setModel(x);                
        for(int i = 0;i < SPALTEN;i++) {
            this.getTableHeader().getColumnModel().getColumn(i).setHeaderValue(HEADER[i]);
        } 
        this.repaint();
    }
    
    public void addNeueZeile() {
        int size = this.col;      
        int rows = this.getModel().getRowCount();
        
        Boolean tmp[] = new Boolean[size];
        for(int i = 0;i < size;i++) {
            tmp[i] = new Boolean(true);
        }        
        this.editable.add(tmp);
        this.editable.trimToSize();
        
        javax.swing.table.DefaultTableModel model = (javax.swing.table.DefaultTableModel)this.getModel();
        
        if(this.ObjectRow == null) {
            String X[] = new String[size];
            for(int i = 0;i < size;i++) {
                X[i] = "";
                tmp[i] = new Boolean(true);
            }
            model.addRow(X);  
        }
        else {
            System.out.println("Object Row nicht NULL");
            java.lang.Object tmprow[] = new java.lang.Object[this.getColumnCount()];
            for(int i = 0;i < this.getColumnCount();i++) {
                try {                  
                    tmprow[i] = this.ObjectRow[i].getClass().newInstance();                    
                }
                catch(Exception e) {
                    System.out.println("Fehler aufgetreten bei erstellen einer neuen Instanz");
                }
            }
            model.addRow(tmprow);
        }        
        this.repaint();
    }
    
    public void loescheZeile(int ZEILE) {
        // zeile löschen
        javax.swing.table.DefaultTableModel tmp = (javax.swing.table.DefaultTableModel)this.getModel();
        tmp.removeRow(ZEILE);
        this.editable.remove(ZEILE);
        this.editable.trimToSize();
    }
    
    public void loescheAlleZeilen() {
        // zeile löschen
        javax.swing.table.DefaultTableModel tmp = (javax.swing.table.DefaultTableModel)this.getModel();
        int t = tmp.getRowCount();
        for(int i = (t-1);i >= 0;i--) {
            tmp.removeRow(i);
            this.editable.remove(i);
        }        
        this.editable.trimToSize();
    }
    
    public void setCellEditable(int ROW, int COL, boolean EDIT) {
        Boolean tmp[] = this.editable.get(ROW);
        tmp[COL] = new Boolean(EDIT);
    }
    
    public void setCellColor(int ROW, int COL, java.awt.Color BGC) {
        this.backgroundcolor.trimToSize();
        this.backgroundcolor.get(ROW)[COL] = BGC;
    }
    
    public void setRowObjects(java.lang.Object X[]) {
        this.ObjectRow = new java.lang.Object[this.col];
        for(int i = 0;i < X.length;i++) {
            javax.swing.table.TableColumnModel colmModel = this.getColumnModel();
            javax.swing.table.TableColumn tc = colmModel.getColumn(i);
            if(X[i].getClass().toString().equals("class java.lang.String") || X[i].getClass().toString().equals("class javax.swing.JTextField")) {
                System.out.println("Objekt ist = " + "java.lang.String");
                javax.swing.JTextField x = new javax.swing.JTextField();
                this.ObjectRow[i] = x;
                tc.setCellEditor(new javax.swing.DefaultCellEditor(x));
            }
            else {
                if(X[i].getClass().toString().equals("class java.lang.Boolean") || X[i].getClass().toString().equals("class javax.swing.JCheckBox")) {
                    System.out.println("Objekt ist = " + "javax.swing.JCheckBox");
                    javax.swing.JCheckBox x = new javax.swing.JCheckBox();
                    this.ObjectRow[i] = x;
                    x.setName("");
                    tc.setCellEditor(new javax.swing.DefaultCellEditor(x));                    
                }
                else {
                    if(X[i].getClass().toString().equals("class javax.swing.JComboBox")) {
                        System.out.println("Objekt ist = " + "javax.swing.JComboBox");
                        javax.swing.JComboBox x = new javax.swing.JComboBox();
                        this.ObjectRow[i] = x;
                        tc.setCellEditor(new javax.swing.DefaultCellEditor(x));
                    }
                }
            }            
        }
    }
}
```

und hier der Code in dem ich die Tabelle erzeuge und das Bsp starte:


```
// erzeuge ScrollPane
        this.ScrollPaneSonstiges = new javax.swing.JScrollPane();
        this.ScrollPaneSonstiges.setBounds(10, 20, 275, 130);
        this.PanelSonstiges.add(this.ScrollPaneSonstiges);
        this.PanelSonstiges.setComponentZOrder(this.ScrollPaneSonstiges, 0);
        
        // erzeuge Table
        int col5 = 5;
        this.TableSonstiges = new MyTable(col5);
        this.TableSonstiges.setBounds(0,0, 275, 130);
        this.TableSonstiges.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        this.ScrollPaneSonstiges.add(this.TableSonstiges);
        this.ScrollPaneSonstiges.setComponentZOrder(this.TableSonstiges, 0);
        this.ScrollPaneSonstiges.setViewportView(this.TableSonstiges);
        
        String header5[] = new String[col5];
        header5[0] = "BenutzerName";
        header5[1] = "SysAktiv";
        header5[2] = "SperrAktiv";
        header5[3] = "Sperrzeit";
        header5[4] = "Test";
        
        this.TableSonstiges.setKopfzeile(header5, col5);
        
        java.lang.Object obj[] = new java.lang.Object[col5];
        obj[0] = new String();
        obj[1] = new javax.swing.JCheckBox();
        obj[2] = new javax.swing.JCheckBox();
        obj[3] = new String();
        obj[4] = new javax.swing.JComboBox();
       
        this.TableSonstiges.setRowObjects(obj);
        javax.swing.table.TableColumn sportColumn = this.TableSonstiges.getColumnModel().getColumn(4);
        javax.swing.JComboBox comboBox = new javax.swing.JComboBox();
        comboBox.addItem("Snowboarding");
        comboBox.addItem("Rowing");
        comboBox.addItem("Chasing toddlers");
        comboBox.addItem("Speed reading");
        comboBox.addItem("Teaching high school");
        comboBox.addItem("None");
        sportColumn.setCellEditor(new javax.swing.DefaultCellEditor(comboBox));
       
        this.TableSonstiges.setPreferredScrollableViewportSize(new java.awt.Dimension(275,130));
        this.TableSonstiges.setFillsViewportHeight(true);
        
        for(int i = 0;i < 10;i++) {
            this.TableSonstiges.addNeueZeile();        
            this.TableSonstiges.renderRow(i);
        }
```

Wie gesagt ich will das Java mir am Ende das Kästchen anzeigt für die CheckBox und das die ComboBox sich aufklappen lässt.

Das ganze soll dann so ähnlich aussehen wie bei Suns Beispiel "How to use Tables" wie unter diesem Link: "http://java.sun.com/docs/books/tutorial/uiswing/components/table.html"

CU Micha


----------



## MeinerEiner_80 (13. Februar 2008)

Moin!
Ich verstehe zwar, was du mit dieser setRowObject() Methode machen willst, aber  du machst das viel zu kompliziert. Lies dir das doch nochmal komplett durch insbesondere das TableDemo.java. Da steht eigentlich genau drin wie mans macht..

*grüssle*
MeinerEiner


----------



## nathaniells freak (13. Februar 2008)

Das steht drin das ich den Standard Renderer verwenden soll und ich dann nicht die Zeilen einfärben kann wie ich will. Außerdem muss ich dann immer sagen addRow(Object[]) und muss das Object immer wieder außerhalb erzeugen. Das wollte ich nicht da ich dann immer mehr schreib aufwand habe den ich mit dieser Version vermeiden wollte. Desweiteren muss ich die Klasse Table ableiten um in der Klasse MyTable Funktionen zu haben wie setLesenBerechtigung(boolean), setSchreibenBerechtigung(boolean), und die get Funktionen dazu.

Deswegen leite ich ab und wegen dem Komfort wollte ich das ganze so programmieren das ich das Object[] nur einmal setze und immer wieder verwende durch die neue Funktion addNeueZeile().

Egal gibt es noch andere die mir weiterhelfen können ohne das mir gesagt wird das ich das nochmal lesen soll? Was ich schon 3 mal getan habe ohne neue Erkenntnis!!

Cu Micha


----------

