# JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen



## IqpI (14. Apr 2015)

Hallo, 

wir arbeiten gerade zu 4. an einer Projektaufgabe und ich bin für das GUI zuständig.
Das ganze soll am Ende eine Mitarbeiterverwaltung mit Datenbankanbindung werden. Nun soll das GUI die Funktion aufweisen, dass ich beim Doppelklick in eine Zeile ein neues Fenster erzeuge, das mir die Daten des Mitarbeiters anzeigt (mehr als in der originalen Tabelle) und ich dort dann löschen oder abbrechen kann. 

Den Table habe ich im Konstruktor des Hauptfensters implementiert, weshalb ich bisher nicht auf die Daten zugreifen kann.

Was muss ich ändern, damit ich auf die Daten komme?

Hier mal meine drei bisherigen Klassen:

Haupt-GUI:


```
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.*;
import java.awt.event.ActionListener;
import java.awt.*;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.JTextArea;
import javax.swing.*;


public class DUMMY implements ActionListener {
     
     JFrame hauptfenster;
     Container c;
     
     // Menüleiste
     JMenuBar menueLeiste;
     
     // Menüleiste Elemente
     JMenu menu;
    
     
     // Menü
     JMenuItem MAanlegen;
     
     //Tabellen Modell
     private final TableModel model;
     
 
     public DUMMY() {
          hauptfenster = new JFrame("JMenuBar Beispiel");
          c = hauptfenster.getContentPane();
          
          // Menüleiste erzeugen
          menueLeiste = new JMenuBar();
          
          // Menüelement erzeugen
          menu = new JMenu("Menü");
         
          
          // Untermenüelement erzeugen
          MAanlegen = new JMenuItem("Neuen Mitarbeite anlegen");
          MAanlegen.addActionListener(this);
         
          
          
          // Menüelemente hinzufügen
          menueLeiste.add(menu);
          
          
          // Untermenüelemente hinzufügen
          menu.add(MAanlegen);         
    
          
          //Name der Tabelle
          JPanel ueberschrift = new JPanel();
          JLabel ueberschrift1 = new JLabel("Mitarbeiter");
          
          
          //Buttonleiste
          JPanel buttonLeiste = new JPanel();
          buttonLeiste.setLayout(new FlowLayout());
          
          
          //Tabellen Inhalt und Überschriften
          String[] columnNames = { "ID", "Vorname", "Nachname", "Steuerklasse"};
          String[][] rowData = { {"1", "Peter", "Franz", "2", "Extern", "Mosbach", "deutsch"}};        
          
          
          //Tabelle erstellen und nicht editable
          model = new DefaultTableModel(rowData, columnNames);               
          JTable tabelle = new JTable(model) {
             public boolean isCellEditable(int x, int y) {
                 return false;
                  }
              };
          tabelle.addMouseListener(new MouseListener());
              
          
          //SortierButtons    
          JButton sortierenNachNachname = new JButton("Sortieren nach Nachname");
          JButton sortierenNachVorname = new JButton("Sortieren nach Vorname");
          JButton sortierenNachID = new JButton("Sortieren nach ID");
          JButton sortierenNachSteuerklasse = new JButton("Sortieren nach Steuerklasse");
          
          
          //Hinzufügen der Elemente zum Container
          c.add( new JScrollPane( tabelle ));
          c.add(ueberschrift, BorderLayout.NORTH);
          ueberschrift.add(ueberschrift1);
          c.add(buttonLeiste, BorderLayout.SOUTH);
          buttonLeiste.add(sortierenNachID);
          buttonLeiste.add(sortierenNachVorname);
          buttonLeiste.add(sortierenNachNachname);
          buttonLeiste.add(sortierenNachSteuerklasse);
          
          
        hauptfenster.add(menueLeiste, BorderLayout.NORTH);
        hauptfenster.setSize(800, 500);
        hauptfenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        hauptfenster.setVisible(true);
     }
     
     public void actionPerformed(ActionEvent object) {
          if (object.getSource() == MAanlegen){
               System.out.println("Neuer Mitarbeiter wird angelegt");
          }         
     }
     
     public static void main(String[] args) {
          new DUMMY();
         
     }
     
     
     
       
     }
```

Hier mein MouseListener:

```
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MouseListener extends MouseAdapter{
    
        
        public void mouseClicked(MouseEvent e){
            if (e.getClickCount() == 2) { 
                new Dialogfenster();
            
        }
        
}
}
```

und zuletzt noch mein sogenanntes Dialogfenster, welches die Daten anzeigen soll:

```
import java.awt.*;

import javax.swing.*;

public class Dialogfenster {

    public Dialogfenster(){
        JFrame dialogfenster = new JFrame ("Dialogfenster");
        JLabel information = new JLabel("test");
        dialogfenster.add(information);
        
        
        dialogfenster.setSize(500, 250);
        dialogfenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        dialogfenster.setVisible(true);
        dialogfenster.setLocation(500,500);
    }
    
    
}
```


Falls es unverständlich ist, einfach fragen.

Ich freue mich über Hilfe 

Gruß Niko


----------



## Thallius (14. Apr 2015)

Ich hoffe einfach mal die Daten in der JTable sind in irgendeiner Form eine Collection einer Klasse. Also must du doch nur beim Doppelklick  auf die Zeile dein Dialogfenster erzeugen und dem gibst du im Konstruktor eine Referenz auf die Instanz der Klasse mit die angeklickt wurde.

Gruß

Claus


----------



## top_chief (14. Apr 2015)

Hallo, hier zu dem Vorschlag von Thallius ein bisschen (JavaFx) Beispiel-Code... 

```
if (mouseEvent.getClickCount() == Const.DOUBLE_CLICKED) {

                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                mMain.editCard(cardListView.getFocusModel()
                                                           .getFocusedItem());
                            }
                        });
                    }
```


----------



## IqpI (14. Apr 2015)

Hi, Danke für die fixen Antworten.

Die Daten sollen in einer Array-List (mit Mitarbeiter Objekten) gespeichert werden.

Wenn ich mit meinem MouseListener in eine Zeile klicke, kann ich dann die Daten übergeben lassen, welche Zeile angegklickt wurde?
Unser Plan ist, dass wir mit übergebenen Parametern, also der angeklickten Zelle, die Suche nach dem Objekt in der Array List starten (über eine get Methode und die Attribute des Mitarbeiters die im JTable stehen) und das dann übergeben an das neue Frame übergeben wird?

Komplizierter Satz, aber icj kann mich nicht besser ausdrücken, da ich eher bildlich denke; -)


----------



## IqpI (20. Apr 2015)

Hallo Leute, ich komme leider überhaupt nicht weiter.

Ich habe mir jetzt noch eine Dummy ArrayList und eine Dummy Mitarbeiter Klasse erstellt und versucht den JTable damit zu füllen. Aber ich komme einfach nicht dahinter, wie ich im Konstruktor meines Fensters dem JTable die Objekte der ArrayList mitgebe. Und ich habe, trotz eurer Antworten, weiterhin keine Ahnung wie ich speziell auf die Daten des angeklickten Objekts in der Tabelle ran kommen soll. 

Das Problem ist, dass wir das mit dem JTable befüllen und darauf zugreifen nicht für einen JTable mit Objekten besprochen haben und ich auch im Internet nichts für mich verständliches finde.


----------

