TableCellRender - Zelle auf editier-/anklickbar setzen

skrobi

Mitglied
Hallo,

ich habe eine Tabelle mit 600 Zellen (B 15 * H 40) definiert. Der besseren optischen Abgrenzbarkeit wegen habe ich sie der Einfachheit halber mittels der Anweisung „table.enable(false);“ komplett auf sichtbar, aber nicht editierbar gesetzt. Mittels eines TableCellRenderes und der Anweisung „label.setBackground(Color.LIGHT_GRAY);“ wurden a‘ Block alle Zellen grau eingefärbt.

Zellen, die später selektier/editierbar sein sollen, habe ich ebenfalls mittels des vorgenannten TCR und zweier for… Loops
for (int areaRows = ……….
for (int areaCols = …….
setColor(areaRows,areaCols,Color.white);

auf weiß gesetzt.

Bis dahin funktioniert alles wie gewünscht.

Frage:
Besteht eine Möglichkeit, bzw. was muss ich tun, damit die 60 weiß gefärbten Zellen selektier-/editierbar innerhalb obiger Loops gesetzt werden, also anklickbar sind
z.B.: ….setCell„table.enable(true);“ so, oder so ähnlich, oder sonst wie ???

Vielen Dank für eine hilfreiche Antwort.
mfG skrobi
 
Ohne irgendwas getestet zu haben: Statt auf der Tabelle enable(false) aufzurufen, solltest Du das direkt auf den Zellen machen können. Sprich: Beim TableCellRenderer wird ja eine Component zurück gegeben und mein erster Versuch wäre, dass man da halt enable(boolean) aufrufen würde.

Aber das ist jetzt nichts, das ich ausgetestet habe. Bei so Fragen kann es interessant sein, ein minimales Beispiel zu erzeugen, bei dem man dann auch schnell so eine Idee ausprobieren kann. Sowas im Rahmen einer Antwort erst aufzubauen kostet in der Regel zu viel Zeit.
 
Für solche Zwecke kann man sich wunderbar ein TableModel schreiben. isCellEditable() liefert dann einfach true oder false, um den Rest kümmert sich die JTable automatisch. Man kann hier auch schön das Decorator-Pattern einsetzen, wenn man will. Oft beantwortet sich die Frage nach der Editierbarkeit aber auch aus den Daten oder zumindest anhand einer Logik, die sich in isCellEditable() abbilden lässt.
 
Im Normalfall (kommt wohl auf das Look & Feel an, aber ich kenn's nur so aus Nimbus, Windows, FlatLaf und Metal) hat isCellEditable() keine optische Auswirkung. Die Zelle reagiert dann einfach nicht. Ist ja auch durchaus sinnvoll, man will ja z.B. Zeilenindizes nicht editierbar haben, die sollen aber trotzdem nicht ausgegraut sein.

Wenn sichtbar sein soll, ob eine Zelle editierbar ist oder nicht, dann kannst du das im Cell-Renderer über die von mihe7 genannte Methode abfragen und die Komponente entsprechend anpassen, natürlich auch abhängig von column (siehe Zeilenindexbeispiel).
 
Hallo KonradN, mihe7, Neumi5694,

Feedback zu unserem Erfolg!

Java:
//  table.enable(false);
//  entfällt und wird ersetzt durch:

    DefaultTableModel WORKTAB = new DefaultTableModel(content, columnNames)
//  ###########################################################################           
//  W A H L W E I S E   T A B E L L E N Z E L L E N   E D I T I E R B A R
//    B Z W.   N I C H T - E D I T I E R B A R   S E T Z E N               
//    ===========================================================================               
    {
    public boolean isCellEditable( int rowIndex , int columnIndex) {
              if ((rowIndex    >= 14  &&  rowIndex    <= 22  &&
                   columnIndex >= 3   &&  columnIndex <= 6)  ||
               (rowIndex    >= 18  &&  rowIndex    <= 21  &&  columnIndex == 2))         
                  {
                   return true;          // TabZelle EDITIERBAR
              } else {
                      return false;      // TabZelle NICHT-EDITIERBAR
                     }
           }
    };

Funktioniert bestens.
Vielen Dank und Gruss
skrobi
 
Oder in kurz:
Java:
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
    return rowIndex >= 14 && rowIndex <= 22 && columnIndex >= 3 && columnIndex <= 6 ||
            rowIndex >= 18 && rowIndex <= 21 && columnIndex == 2;
}
EDIT: weitere tausend Leerzeichen entfernt 🙂
 

Zurück
Oben