Checkbox in JTable Cell anklicken


#1

Hallo zusammen,

Ich habe eine JTable, in der die erste Spalte durch

public Class<?> getColumnClass(int column) {
	        if(column == 0){
	            return Boolean.class;
	        }
	        return super.getColumnClass(column);
	 }

als Checkboxen dargstellt wird. Diese habe ich mit einem TableModelListener versehen. Da ich momentan aber die Codestrukur umstelle möchte ich vorher gerne einen Test schreiben, der überprüft, ob der Listener richtig gesetzt ist und das tut was ich möchte. Leider scheitere ich daran, den Listener zu “aktivieren”. Für eine JCheckBox z.B. gibt es ja die
doClick(); Methode. Kann ich so etwas auch für eine Zelle einer JTable erreichen?

Wenn ich das Programm ausführe, funktioniert der Listener wie gewünscht, aber im Test scheitern alle Versuche mit table.tableChanged(); oder tablemodel.fireTableChanged().

Grüße,
AceOfSpades


#2

Ich habs nicht ganz verstanden, was du machen möchtest.
Soll der Benutzer anklicken/ändern (Editor benötigt) können, oder möchtest du den Zustand des Wahrheitswertes in der JTable mit Hilfe einer JCheckBox darstellen (Renderer benötigt) können?


#3

Ich möchte einen Klick auf die Checkbox in der JTable simulieren, um den darauf liegenden Listener zu aktivieren.


#4

Warum brauchst Du einen eigenen Listener? Wenn Du das TableModel der Tabelle mitteilen läßt, das in der ersten Spalte [INLINE]Boolean[/INLINE]s sind macht Swing für Dich des Rest und du kannst die Booleans direkt an der [INLINE]setValueAt()[/INLINE]-Methode abgreifen. Wenn Du also was testen willst, dann das das TableModel die richtige Spalte as [INLINE]Boolean[/INLINE] ausweist.

bye
TT


#5

Ok, es scheint als ob mein Problem nicht ganz klar formuliert ist:

Ich habe eine Tabelle, in deren TableModel die erste Spalte als [INLINE]Boolean[/INLINE] ausgewiesen ist (siehe oben). Diese Spalte wird bei Programmstart dann als Checkboxen angezeigt, die der Nutzer an- und abwählen kann, wie das eben so ist.
Auf die Tabelle habe ich dann einen [INLINE]TableModelListener[/INLINE] gelegt. Den brauche ich, weil der Nutzer die Checkboxen an- und abwählen kann und sich der Wert ja dann ändert. Der Listener sieht vereinfacht so aus

public class MyTableModelListener implements TableModelListener{

    private JTable myTable

    public MyTableModelListener(JTable theTable){
        this.myTable = theTable;
    }
    
    @Override
     public void tableChanged(TableModelEvent e) {
	this.foo(myTable.getSelectedRow())
     }

     private void foo(int row){
         if((Boolean) myTable.getModel().getValueAt(row, 0))
	someClass.doThis(row);	
         else
	someClass.doThat(row);  
    }             
}

Wenn also der Nutzer auf eine Checkbox drückt, wird je nachdem ob sie nun an- oder abgewählt ist eine bestimmte Methode aufgerufen.

Ich möchte nun TESTEN, ob der Listener im übrigen Code richtig gesetzt ist. Das liegt hauptsächlich daran, dass ich meine Codestruktur mit der Hinzunahme neuer Elemente des öfteren überarbeiten muss und daher die Listener an anderer Stelle oder anders implementiert werden.

Der Test soll dann folgendes tun: Eine Tabelle erstellen und den Listener setzen, [B]auf eine der Checkboxen “klicken”[/B] und dann überprüfen, ob die Methoden aufgerufen wurden.
Das Problem ist nun, dass eben dieser Klick für mich gerade nicht so einfach ist. Ich wiederhole mich: bei einer normalen JCheckBox kann ich so etwas mit [INLINE]checkBox.doClick();[/INLINE] überprüfen. Und hier nun nochmal meine abschließende Frage zu dem Problem, dass nun hoffentlich ausführlich genug beschrieben ist:

[B]Gibt es so etwas wie [INLINE]doClick()[/INLINE] auch für eine JTable, deren Zellen mit [INLINE]Boolean[/INLINE] gerendert werden?[/B]

Grüße,
Ace


#6

Nein, ein TableModelListener reagiert wenn sich dein Model ändert, nicht wenn der Benutzer irgendwo draufklickt. Viel eher macht es hier Sinn, sich einen eigenen CellEditor für deine Checkbox zu schreiben und dem z.B einen Actionlistener hinzufügen oder gleich innerhalb von dem deine Arbeit verrichten.


#7

Dankeschön, ich habe es nun statt
myTable.setValueAt(true, 0, 0)
mit
myTable.getModel().setValueAt(true, 0, 0)
versucht und es klappt. Hatte nicht bemerkt dass ihr die ganze Zeit vom TableModel redet während ich versuche, die JTable zu ändern.