2012-04-03 11 views
4

Ist es möglich, für JTable ein ActionListener auf einen Spaltenkopf hinzuzufügen.hinzufügen Action zu Spaltenüberschrift von JTable

Hier ist mein Tisch My table image

Nun, ich möchte eine ActionListener auf die Spaltenüberschriften hinzufügen (z WQE, SDM) Ich mag würde in der Lage sein, die Spaltenbezeichnung in einem anderen Fenster zu zeigen.

+0

Siehe auch dieses [Q & A] (http://stackoverflow.com/q/7137786/230513). – trashgod

Antwort

14

siehe Beispiel unten

  • fügen Sie einen Mouselistener auf den Spaltenkopf
  • Verwendung table.columnAtPoint(), um herauszufinden, welchen Spaltenkopf

-Code geklickt wurde voll funktionsfähig:

// example table with 2 cols 
JFrame frame = new JFrame(); 
final JTable table = new JTable(new DefaultTableModel(new String[] { 
     "foo", "bar" }, 2)); 
frame.getContentPane().setLayout(
     new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); 
frame.getContentPane().add(table.getTableHeader()); 
frame.getContentPane().add(table); 
frame.pack(); 
frame.setVisible(true); 

// listener 
table.getTableHeader().addMouseListener(new MouseAdapter() { 
    @Override 
    public void mouseClicked(MouseEvent e) { 
     int col = table.columnAtPoint(e.getPoint()); 
     String name = table.getColumnName(col); 
     System.out.println("Column index selected " + col + " " + name); 
    } 
}); 
+1

+1 Dies ist der im Tutorial vorgeschlagene und hier [http://stackoverflow.com/a/7137801/230513] dargestellte Ansatz. – trashgod

+0

großartig! Ich hätte nie gedacht, dass das Ereignis auf Kopf mouseClicked ist besser als die Ereignisse auf table.:D – gumuruh

1

Ja, es ist möglich. Sie können Mausereignis Sowohl auf die Spaltenüberschriften und Zellen wie folgt hinzu:

private class MyMouseAdapter extends MouseAdapter { 

    public void mousePressed(MouseEvent e) { 

     if (table.equals(e.getSource())) { 

      int colIdx = table.columnAtPoint(e.getPoint()); 
      int rowIdx = table.rowAtPoint(e.getPoint()); 
Object obj = table.getModel().getValueAt(rowIdx, colIdx) ;//This gets the value in the cells 
      String str = obj.toString();//This converts that Value to String 
      JTextField somefield = new JTextField();//Choose a JTextField 
      somefield.setText(str);//Populates the Clicked value to the JTextField 

      System.out.println("Row: " + rowIdx + " " + "Colulmn: " + colIdx); 
     } 
     else if (header.equals(e.getSource())) { 

      int selectedColumnIdx = header.columnAtPoint(e.getPoint()); 
      String colName = table.getColumnName(header.columnAtPoint(e.getPoint())); 

      System.out.println("Column Name: " + colName); 
      System.out.println("Selected Column: " + selectedColumnIdx); 
     } 
    } 
} 

den Mustercode Fix Your Geschmack und Präferenz zu entsprechen;

+0

Besser eine [ 'ListSelectionListener'] (http://docs.oracle.com/javase/tutorial/uiswing/components/table zu verwenden. html # Auswahl) auf dem Tisch selbst. Der Header-Listener wiederholt @ Adams viel früher [Antwort] (http://stackoverflow.com/a/9992631/230513). – trashgod