Axel Richter: JTable - Zelle automatisch selektieren

Beitrag lesen

Hallo,

Was genau meinst du mit "JTable erweitern"?

So was ähnliches, wie Du untern machst, also nicht mit dem Standard JTable arbeiten, sondern dessen Methoden und ggf. sogar dessen Eigenschaften überschreiben und erweitern. Wie genau das zu tun wäre, damit man, wie Du wolltest, [TableModel].setValueAt() explizit im Progammcode aufrufen könnte, weiß ich allerdings auch nicht. Das sollte aber auch _irgendwie_ gehen. Es wäre aber, wie gesagt, meiner Meinung nach keiner weiteren Recherche wert, weil unsinnig ;-).

Mittlerweile habe ich mir auch eine Lösung zusammengereimt und sie mit deiner verglichen. Jetzt bleibt die Frage offen, welche der beiden Lösungen die für dieses Beispiel bessere ist. Die Eingabe in dieser Tabelle wird an eine höhere Klasse, sozusagen die "Fachlogik-Klasse", weitergereicht, die beim falschen Einlesen in die ArrayList, die das "Endziel" der Eingabe ist, bereits auch schon eine IllegalArgumentException wirft, wodurch das nochmalige Überprüfen in der GUI eigentlich nicht notwendig scheint, da man ja sonst die gleiche Überprüfung zwei Mal macht.
Ich habe meine Klasse im GUI folgendermaßen angepasst:

public void tableChanged(TableModelEvent e) {
  int row = e.getFirstRow();
  int col = e.getColumn();

if (col == 0)   {
     try   {
        pdfleser.telefonnrHinzufuegen(tablemodel.getValueAt(row, col).toString());
     }
     catch (IllegalArgumentException iae)  {
     JOptionPane.showMessageDialog(this, iae);
     }
  }

}


>   
> (Die Verschönerung, dass der "Cursor" nicht ins nächste Feld springt, werde ich dann noch gleich hinzufügen)  

Ja? Wie? Das stelle ich mir nicht so einfach vor. Wenn .tableChanged() involviert wird, ist der CellEditor schon fertig. Dann noch zu versuchen die Standard-Reaktion auf .stopCellEditing() noch zu verhindern oder gar wieder rückgängig zu machen, wäre wahrscheinlich kompliziert. Lasse mich aber gerne vom Gegenteil überzeugen ;-).  
  

> Mache ich es so, würde das sogar mein TelefonTableModel überflüssig machen, da ich dann nichts Spezielles mehr in dieser Klasse überprüfen müsste.  

Ja, wäre es mit meiner Methode auch.  
  

> Wäre diese Lösung besser, oder hätte ich die Sache mit deiner Lösung verwirklichen sollen.  
> (Vielleicht treten ja später noch Umstände auf, die meine bisherige Lösung verkomplizieren)  
  
Von der Logik her würde ich die Inhaltsvalidierung von Zellinhalten im CellEditor vornehmen, Dort hast Du via  
  
((JComponent)getComponent())  
  
zugriff auf das JComponent, welches die Zelle im Moment der Eingabe repräsentiert. In meinem Beispiel lese ich damit nur den Inhalt aus:  
  
String wert = ((JTextField)getComponent()).getText().trim();  
  
Du kannst aber mit dem JTextField auch alles Andere machen, was Du mit einem JTextField machen kannst. Bspw.: .setBackground(), .setForeground(), .selectAll(), .setCaretPosition() ...  
  
viele Grüße  
  
Axel