# Zellen in JTable auf Klick kurz markieren auf Klick



## anquijix (30. Mrz 2007)

Tagwohl

Ich habe es hier mit einer überkomplexen Tabelle zu tun, die auf irgendwelche Weise zusammengebaut wird. Ich kann darin gewisse Zellen anklicken und damit deren Inhalt verändern oder ich kann Text in eine Zelle einfügen oder es geht ein Subfenster auf, wenn ich in die entsprechende Zelle klicke. 

Nun ist es meine Aufgabe, die Zellen, die nur zum "Toggeln" angeklickt werden, kurz nach dem Klick zu umrahmen, färben, markieren oder so und darauf gleich wieder auf den alten Zustand bringen. Ich, bzw der Auftrag Gebende möchte das, um zu wissen, was er gerade angeklickt hat. 

Für einen Fall funktioniert dies schon wunderbar. Nämlich bei den Zellen, bei denen ein Subfenster auf Klick aufgeht. Da setze ich die Zelle bspw.  auf Schwarz, das Subfenster geht auf, ich bearbeite dort dies und das, und wenn ich es schliesse, wird die Zelle wieder in ihre Grundfarbe zurückgesetzt. 

So ala:

```
cell.setBackground(Color.BLACK);
modalinternalframe.setVisible(true);
cell.setBackground(bg);
```

Auf ähnliche Weise wollte ich es auch bei den "Toggle-Zellen" machen. Ausser, dass ich eben hier kein Subfenster oder dergleichen öffne. Genau aus diesem Grund geht diese Vorgehensweise nicht wirklich, da es viel zu schnell geht, als dass es sichtbar wäre auf dem Schirm. Die Färbung findet wohl statt, aber ich krieg niemals etwas davon mit. Hab mir auch überlegt, einen kurzen wait einzubauen, aber das ist wohl überbeknackt, darum lass ichs ileber sein. 

Hat jemand eine Idee, wie ich die kurze Färbung trotzdem hinkriege? Es würde schon so ein Rahmen reichen, der erscheint, wenn ich cell.setEditable mache. Nur möchte ich das Feld nicht editieren können, lediglich die Markierung soll stattfinden. 

Hoffe, meine Problematik verständlich rübergebracht zu haben. 

Hier noch ein Code-Schnipsel mit der Spalte "R" als Beispiel.  Danke für Tipps.

```
dm.setClickListener(new TableClickListener() {
        public void clicked(JTable table, TableCell cell, int row, int column) {
          String identifier = cell.getIdentifier();
          boolean hasAction = true;
                    

          // the other values
          String r = nullIfEmpty((String) ((TableCell) table.
                  getValueAt(row, 0)).getValue());
          String i = nullIfEmpty((String) ((TableCell) table.
                  getValueAt(row, 1)).getValue());
          String n = nullIfEmpty((String) ((TableCell) table.
                  getValueAt(row, 2)).getValue());
          String a = nullIfEmpty((String) ((TableCell) table.
                  getValueAt(row, 3)).getValue());
          String f = nullIfEmpty((String) ((TableCell) table.
                  getValueAt(row, 4)).getValue());
          TableCell codeCell = (TableCell) table.getValueAt(row, 5);
          String code = nullIfEmpty((String) codeCell.getValue());
          int methtypnr = (Integer) codeCell.
                  getAdditionalRowValue(ROWVAL_METHODETYPNR);
          String meth2 = nullIfEmpty((String) codeCell.
                  getAdditionalRowValue(ROWVAL_METHODENR2));
          String keim = nullIfEmpty((String) ((TableCell) table.
                  getValueAt(row, 10)).getValue());
          

          Color bg = cell.getBackground();            
          if (identifier.equals(TABLE_R)) {                        
            /* ************
             *  RRR
             *  R  R
             *  RRR
             *  R  R
             *  R  R
             ************ */
            // just ignore clicks on 'r'             
            if (hasAction) {
              cell.setBackground(Color.BLACK);
              //nachkontrMif.setVisible(true);
              cell.setBackground(bg);
            }
          }.....etc...
```


----------



## André Uhres (30. Mrz 2007)

Mit table.setSelectionBackground(..) kann man die Selektionsfarbe setzen. Ansonsten versteh ich dein Problem nicht wirklich.


----------



## kleiner_held (1. Apr 2007)

Wenn ich das richtig verstehe willst du folgendes:
Nach einer Nutzeraktion soll eine Tabellenzelle eingefärbt werden und nach einem bestimmten Zeitraum (z.B. 10 Sekunden) soll die Einfärbung zurückgesetzt werden.
Während dieses Zeitraums kann man normal weiter arbeiten, andere Tabellenzellen anklicken usw...

kurz skizziert würde ich das so lösen:

```
cell.setBackground(Color.RED); // angklickte zelle martkieren
Thread t = new Thread()  // neuen Thread starten der nach 10 Sekunden zurückändert
{
    public void run() 
    {
        try
        {
            // 10 Sekunden warten
            sleep(10000);
        }
        catch ( InterruptedException e )
        {
        }
        // das Zurücksetzen als Runnable durch den AWT EventQueue ausführen lassen
        SwingUtilities.invokeLater(new Runnable()
        {
             public void run() 
             {
                 cell.setBackground(Color.WHITE);
             }
        });
    }
};
t.start();
```

Du musst noch das Tablecell Objekt richtig durchreichen, aber das Prinzip sollte deutlich werden. Dabei gibt es ein paar Randeffekte zu beachten, was soll passieren, wenn der Nutzer innerhalb der 10 Sekunden ein zweites mal in die Zelle klickt, kann der angelegte Thread die Programmterminierung blockieren, wirken sich die Threads negativ auf die Performance aus (wenn sehr oft neue Threads gestartet werden) usw. Möglich wäre auch genau einmal einen Deamonthread zu starten und die Aktionen für das Zurücksetzen mit Zeitstempel in eine Queue einzuordnen.


----------

