Robert: JTable: Zeilenweise selektieren, bei Ctrl-C nur 1 Zelle kopieren

Hallöle,

Ich habe eine JTable mit (im wesentlichen)
setColumnSelectionAllowed(false); und
setRowSelectionAllowed(true);

Wenn ich auf eine Zelle klicke, wird folgerichtig die gesamte Zeile als selektiert markiert, zusätzlich hat die Zelle, die ich getroffen habe, noch einen dickeren Rahmen (Fokusmarkierung?).

Soweit bin ich also zufrieden, das Selektieren klappt wie gewünscht.

Aber:
Wenn ich jetzt per Ctrl-C kopiere, werden mir alle Zellen der Zeile(n) kopiert, ich hätte aber gerne nur den Wert der einen Zelle im Zwischenspeicher (aber die ganze Zeile soll selektiert bleiben).

Kann mich mal jemand in die richtige Richtung schubsen?
Wie bekomme ich das hin?

Danke!

cu,
Robert

  1. Hallo Robert,

    Wenn ich jetzt per Ctrl-C kopiere, werden mir alle Zellen der Zeile(n) kopiert, ich hätte aber gerne nur den Wert der einen Zelle im Zwischenspeicher (aber die ganze Zeile soll selektiert bleiben).

    Du willst also das Default-Verhalten fürs Kopieren überschreiben.
    Bei Swing gibt es die Klasse ActionMap. ActionMaps bilden Objekte (in der Regel Strings) auf Actions ab.

    Die Action fürs Kopieren sollte sich so austauschen lassen:

    ;  
    jtable.getActionMap().put("copy", new AbstractAction() {...});  
    
    

    Grüße

    Daniel

    1. Hallöle,

      Bei Swing gibt es die Klasse ActionMap. ActionMaps bilden Objekte (in der Regel Strings) auf Actions ab.
      Die Action fürs Kopieren sollte sich so austauschen lassen:

      ;

      jtable.getActionMap().put("copy", new AbstractAction() {...});

        
      Vielen lieben Dank, das hat mich zu folgender Lösung gebracht:  
        
      Mein Code zum Abfangen des Events:  
      ~~~java
        
      jTable.getActionMap().put("copy", new AbstractAction()  
          {  
              public void actionPerformed(ActionEvent e)  
              {  
                  copyActiveCell(jTable);  
              }  
          }  
      );  
      
      

      und der Code für's eigentliche Event-Handling (da ich das für mehrere Tables benutzen will, als Extra-Methode, nicht direkt im Listener (ja, ich weiß, das könnte man auch mit einer Ableitung von JTable lösen):

        
      private void copyActiveCell(JTable table)  
      {  
          int col = table.getSelectedColumn();  
          int row = table.getSelectionModel().getLeadSelectionIndex();  
          if (row == -1)  
          {  
              row = table.getSelectedRow();  
          }  
          if ((row >= 0) && (col >= 0))  
          {  
              Object cellValue = table.getValueAt(row, col);  
              if (cellValue != null)  
              {  
                  Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(cellValue.toString()), null);  
              }  
          }  
      }  
      
      

      Das scheint soweit zu funktionieren.

      Eine Frage bleibt aber noch:
      Gibt es eine Liste der definierten Strings, die ich bei dem put in die ActionMap verwenden kann?
      Also eine Liste der verfügbaren Events?
      Klar, wenn ich eigene Events definiere, kann ich auch deren Namen frei vergeben, so daß es keine allgemeine Liste geben kann.
      Aber einige Events sind ja wohl vordefiniert, siehe "copy".
      In der API-Doc zu ActionMap hab ich nichts gefunden.

      cu,
      Robert

      1. Hallo Robert,

        Gibt es eine Liste der definierten Strings, die ich bei dem put in die ActionMap verwenden kann?

        Ich wüsste nicht, dass das irgendwo festgelegt ist.
        Nimm einfach einen Debugger oder schreib ein Programm, das Dir ausgibt, was da drin steht. So sehr geheimnisvoll wird das nicht sein.
        Was nicht dokumentiert wird, könnte sich natürlich theoretisch ändern. Ich sehe in dem Fall aber keine Gefahr, der Mechanismus an sich ist ja so dokumentiert und es gibt nicht viel sinnvolle Möglichkeiten oder Gründe die Einträge anders zu benennen.

        Grüße

        Daniel