# JTable und ActionListener



## Guest (30. Okt 2007)

Hallo Leute,

hab ein kleines Problem mit meiner JTable. Ich würde gerne, wenn jemand eine Zeile der Tabelle anklickt, ein Actionperformed Event abschicken.

Hier mal mein Aufbau(vereinfacht):


```
public class MainWindow extends JFrame implements ActionListener{
	public MainWindow(){
		initComponents();
	}
	
	private void initComponents(){
		JButton button = new JButton();
		button.setActionCommand("Exit");
		button.addActionListener(this);
		
		JTable table = new JTable(stringarray);
		
		// Hier jetzt das Gleiche Vorgehen wie beim button
		// Leider gibt es für JTable kein setActionCommand()
		// Wie laesst sich das Lösen
		
		pack();
		setVisible(true);
	}
	
	public void actionPerformed(ActionEvent evt){
		String cmd = evt.getActionCommand();
		if(cmd.equalsIgnoreCase("Exit")){
			System.exit(0);
		}
	}
}
```

Wenn jemand auf den Button klickt, dann wird die actionPerformed Methode aufgerufen und mit getActionCommand() ausgewertet und eine Aktion gestartet. 
Nur wie mache ich das mit einer JTable ohne den gesamten Aufbau des Programms zu ändern?


----------



## Guest (30. Okt 2007)

Geht das nur so?


```
public class MainWindow extends JFrame implements ActionListener,MouseListener{
   public MainWindow(){
      initComponents();
   }
   
   private void initComponents(){
      JButton button = new JButton();
      button.setActionCommand("Exit");
      button.addActionListener(this);
      
      JTable table = new JTable(stringarray);      
      table.addMouseListener(this);

      
      pack();
      setVisible(true);
   }
	public void mouseEntered(MouseEvent evt){
		
	}
	public void mouseClicked(MouseEvent evt){
		Component comp = evt.getComponent();
		if(comp == table){
			// do something...
		}
	}
	public void mouseExited(MouseEvent evt){
		
	}
	public void mousePressed(MouseEvent evt){

	}
	public void mouseReleased(MouseEvent evt){
		
	}   
   public void actionPerformed(ActionEvent evt){
      String cmd = evt.getActionCommand();
      if(cmd.equalsIgnoreCase("Exit")){
         System.exit(0);
      }
   }
}
```


----------



## SlaterB (30. Okt 2007)

ListSelectionListener gibts auch noch

http://java.sun.com/docs/books/tutorial/uiswing/components/table.html
http://java.sun.com/docs/books/tutorial/uiswing/events/listselectionlistener.html


----------



## wayne (30. Okt 2007)

das mit dem MouseListener ist eine möglichkeit. eine andere, saubere lösung wäre es, wenn du deinen eigenen TableCellRenderer oder TableCellEditor schreibst. das ist relativ einfach und bietet dir folgende optionen. bei einem TableCellEditor wird die methode getTableCellEditorComponent(...) aufgerufen, wenn eine zelle editiert werden soll. du könntest dann deine aktion durchführen bzw. eine andere instanz davon benachrichtigen. bei einem TableCellRenderer könntest du hingegen eine Component als renderer einer zelle übergeben, auf die du dich als ActionListener oder MouseListener registriert hast und so mitbekommen, ob sie selektiert wird (das wäre dann also ein noch vor dem editieren durch einen einfach mausklick auslösbares event). eine weitere lösungsmöglichkeit wäre es sich als ListSelectionListener auf das ListSelectionModel einzutragen. da erhältst du events, sobald sich die selektion der tabelle ändert, also wenn ein mausklick erfolgte oder mit der tastatur die selektion verschoben wurde. warscheinlich ist es auch eine lösung, sich als PropertyChangeListener an das JTable zu hängen und nach entsprechenden events zu fahnden.

viel erfolg

wayne


----------

