# Problem mit JCheckBox in JTable



## nhocgirl0105 (14. April 2007)

Hallo zusammen

Ich habe JCheckBox in einer JTable hinzugefügt. Das Problem ist, dass das Hacken der Checkbox immer gesetzt/nicht gesetzt wird, egal wenn es eine mouseClicked oder mouseReleased... Event. Ich möchte aber nur, dass das Checkbox auf mouseClicked reagiert. Kann jemand mir helfen? Danke vielmals. 

Gruss
Tannie


  public MyTableModel() {    
    //insert column titles
    columnTittles.add("");
    columnTittles.add("Lines' ID");
    columnTittles.add("Lines' Customer Texts");


  }

  public int getColumnCount() {
    return columnTittles.size();
  }

  public int getRowCount() {    
    return rowDataLines.size();
  }

  public Object getValueAt(int rowIndex, int columnIndex) {
    return rowDataLines.get(rowIndex).get(columnIndex);
  }

  public String getColumnName(int columnIndex) {
    return columnTittles.get(columnIndex).toString();
  }

  /**
   * JTable uses this method to determine the default renderer/editor
   * for each cell. If this method didn't be implemented, then the first column
   * would contain text ("true"/"false"), rather than a checkbox.
   * @see javax.swing.table.AbstractTableModel#getColumnClass(int)
   */
  public Class getColumnClass (int columnIndex) {
    return getValueAt(FIRST_ROW, columnIndex).getClass();
  }

  public boolean isCellEditable(int rowIndex, int columnIndex) {
    boolean isEditable = false;
    if (columnIndex == 0) {
      isEditable = true;
    }
    return isEditable;
  }

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

    fireTableCellUpdated(rowIndex, columnIndex);
  }


----------



## philBerlin (15. April 2007)

Hallo hallo,

kann gut sein, dass es einen eleganteren Weg gibt, aber mit diesem kleinen hack kannste das machen:

 * Du setzt das TableModel für diese Spalte auf auf nicht editierbar:

```
public boolean isCellEditable(int row, int col) {
                    If (col == xy) return false;
                }
```

 * Dann fängst Du das Event direkt in der Tabelle ab, also in Deinem Fall:

```
table.addMouseListener(new MouseAdapter() {

                    public void mouseClicked(MouseEvent e) {
                        table_mouseClicked(e);
                    }
                });
```

 * Dann musst Du nur noch in der Funktion table_mouseClicked(e); den Wert wieder setzen. Schließlich sollte nur noch auf mouseClicked reagiert werden.

Was Du vielleicht noch wissen solltest: mouseClicked = mousePressed + mouseReleased.
 Das event mousePressed ist dann, wenn Du die Maustaste drückst.
 Das event mouseReleased ist dann, wenn Du die Maustaste wieder loslässt.

So gesehen ist mouseClicked das Gleiche wie mouseReleased, weil der Click nur mit dem Loslassen der Maustaste vollständig ist. Sinn macht das Ganze deswegen nur, wenn Du das Event auf mousePressed oder auf ein anderes Event außer mouseClicked und mousePressed, beschränken willst.

grüße phil


----------

