# JCheckBox in einer JTable auswählbar machen



## kekskennzeichen (20. Aug 2008)

Hallo,

ich hab nen kleines Problem, ich hab mir hier aus dem FAQ das Tutorial über JTable rein gezogen, treffe nun aber auf ein Problem.
Ich möchte in der Table in Spalte 2 JCheckboxen haben, in seinem Beispiel EditableTable macht er das ja auch wunderbar, also vielmehr es geht, man kann dort die JCheckbox auswählen und ihren Wert ändern.

Hier mal der Code dazu 

```
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

public class EditableTable {

  public static void main(String[] a) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    String[] columnTitles = { "First Name", "Last Name", "Weight (lb)", "Blood Group", "Age>20yrs" };
    Object[][] dataEntries = { { "Saravan", "Pantham", new Integer(50), "B", new Boolean(false) },
        { "Eric", "", new Integer(180), "O", new Boolean(true) },
        { "John", "", new Integer(120), "AB", new Boolean(false) },
        { "Mathew", "", new Integer(140), "A", new Boolean(true) }, };
    TableModel model = new EditableTableModel(columnTitles, dataEntries);
    JTable table = new JTable(model);
    table.createDefaultColumnsFromModel();

    String[] bloodGroups = { "A", "B", "AB", "O" };
    JComboBox comboBox = new JComboBox(bloodGroups);
    table.getColumnModel().getColumn(3).setCellEditor(new DefaultCellEditor(comboBox));

    frame.add(new JScrollPane(table));

    frame.setSize(300, 200);
    frame.setVisible(true);
  }


}

class EditableTableModel extends AbstractTableModel {
  String[] columnTitles;

  Object[][] dataEntries;

  int rowCount;

  public EditableTableModel(String[] columnTitles, Object[][] dataEntries) {
    this.columnTitles = columnTitles;
    this.dataEntries = dataEntries;
  }

  public int getRowCount() {
    return dataEntries.length;
  }

  public int getColumnCount() {
    return columnTitles.length;
  }

  public Object getValueAt(int row, int column) {
    return dataEntries[row][column];
  }

  public String getColumnName(int column) {
    return columnTitles[column];
  }

  public Class getColumnClass(int column) {
    return getValueAt(0, column).getClass();
  }

  public boolean isCellEditable(int row, int column) {
    return true;
  }

  public void setValueAt(Object value, int row, int column) {
    dataEntries[row][column] = value;
  }
}
```

So ich habe darauf hin ein anderes Beispiel erweitert, nur bei mir kommt nur Müll raus, sprich man kann den Wert der JCheckbox nicht ändern. Ich hab auch schon versucht mit den beiden Zeilen


```
table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(new JCheckbox()));
 table.createDefaultColumnsFromModel();
```

etwas zu erreichen aber fehlanzeige.


Hier mal mein Code

```
import java.awt.BorderLayout;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;


public class TableTest
{

   public static void main (String args[])
   {
      JFrame frame = new JFrame ("Editable Color Table");
      frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
      VTselectTableModel model = new VTselectTableModel();;
      JTable table = new JTable (model);
      
      
      Vector <Object> v1 = new Vector <Object> ( );
      v1.add ("Power");
      v1.add (new Boolean(false));
      Vector <Object> v2 = new Vector <Object> ( );
      v2.add ("Power Max");
      v2.add (new Boolean(true));

      model.addRow (v1);
      model.addRow (v2);
      
      table.createDefaultColumnsFromModel();
      JScrollPane scrollPane = new JScrollPane (table);
      frame.add (scrollPane, BorderLayout.CENTER);
      frame.setSize (400, 150);
      frame.setVisible (true);
   }
}
```

Und das dazu gehörige Tablemodel


```
import java.util.Vector;

import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;



public class VTselectTableModel extends AbstractTableModel
{
   /**
    * 
    */
   private static final long serialVersionUID = -4021085690657315775L;
   private Vector <TableModelListener> listeners   = new Vector <TableModelListener> ( );
   private Vector <Vector <Object>>    dataEntries = new Vector <Vector <Object>> ( );


   public void addTableModelListener (TableModelListener l)
   {
      listeners.add (l);
   }


   public void removeTableModelListener (TableModelListener l)
   {
      listeners.remove (l);

   }


   public Class <?> getColumnClass (int columnIndex)
   {
      switch (columnIndex)
      {
      case 0:
         return String.class;
      case 1:
         return Boolean.class;
      default:
         return null;
      }
   }


   public int getColumnCount ( )
   {
      // TODO Auto-generated method stub
      return 2;
   }


   public String getColumnName (int columnIndex)
   {
      switch (columnIndex)
      {
      case 0:
         return "ValueType";
      case 1:
         return "Selected";
      default:
         return null;
      }
   }


   public int getRowCount ( )
   {
      // TODO Auto-generated method stub
      return dataEntries.size ( );
   }


   public Object getValueAt (int rowIndex, int columnIndex)
   {
      Vector<Object> temp = dataEntries.get (rowIndex);
      return temp.get (columnIndex);
   }


   public boolean isCellEditable (int rowIndex, int columnIndex)
   {
      return true;  
   }


   public void setValueAt (Object value, int rowIndex, int columnIndex)
   {
      // TODO Auto-generated method stub

   }
   
   public void addRow(Vector<Object> row){
      dataEntries.add (row);
   }
}
```

Vielleicht kann mir ja jemand nen Tip geben...

gruß
keks[/code]


----------



## SlaterB (20. Aug 2008)

ich will mich ja nicht zu weit aus dem Fenster lehnen,
aber dass die Änderung des Modelinhalts bei 

```
public void setValueAt (Object value, int rowIndex, int columnIndex) 
   { 
      // TODO Auto-generated method stub 

   }
```
nicht geht, verwundert mich irgendwie nicht 

wie wärs mit

```
public void setValueAt(Object value, int rowIndex, int columnIndex)
    {
        Vector<Object> temp = dataEntries.get(rowIndex);
        temp.set(columnIndex, value);

    }
```
?


----------



## kekskennzeichen (20. Aug 2008)

Danke so klappt es jetzt.

Man sollte sich das Interface welches man nutz schonmal genauer anschauen!  :roll:


----------

