# Daten aus JTable in JTextField übertragen



## raptorrs (21. Feb 2008)

Moin zusammen,

wahrscheinlich steh' ich nur auf dem Schlauch, aber ich habe folgendes Probem:

Auf einem BasisPanel liegt oben ein Panel-1. Dieses Panel enthält JTextFields.
Unten liegt ein Panel-2. Auf diesem liegt eine JTable mit ScrollPane.

An der JTable hängt ein MouseEventListener. Bei Doppelklick sollen alle Daten einer selektierten Zeile aus der JTable in die Textfelder des oberen Panel-1 transferiert werden. 

Ich kriegs seit einer Woche nicht hin. Lägen die Textfelder im selben Panel wie die JTable, wäre alles kein Problem. Aber das Panel-1 bekommt einfach nicht mit, das im unteren Panel-2 ein Event stattgefunden hat. Alle eingebauten Features der Table funktionieren ohne Probleme. Nur der Datentransfer nicht.

Wie bekomme ich Panel-1 dazu, nach einem Mouseevent in der JTable die entspreche Methode auszuführen?

Von mir aus schreibt auch die JTable die Daten in Panel-1

Danke im Voraus!!


----------



## 0x7F800000 (21. Feb 2008)

mein vorschlag (ich weis es nicht besser, bitte nicht hauen^^)
du leitest dir von einem normalen MouseEventListener einen spezielleren ab, der zusätzlich alle referenzen auf deine JTextFields erhält. Wenn du jetzt im JTable da mit der mau herumhantierst, kriegt dein modifizierter MouseEventListener(textFieldRefs) alle ereignisse, und wenn was passiert kannst du einerseits mit 

(JTable)(e.getSource()) auf das JTable

und mit den JtextFields-referenzen direkt auf die ganzen Textfelder zugreifen...

Ist das okay?  :bae:


----------



## raptorrs (23. Feb 2008)

Andrey,

Danke für die Antwort! Und das Nachts um 2:00 !!

Aber leider bin ich daraus nicht schlauer geworden. Habe das Problem vielleich auch schlecht geschildert.

Zur Verdeutlichung habe ich jetzt mal ein kleines Programm angehängt.

Beim Doppelklick auf das Externe Panel wird die Funktion setTextFieldOben einfach nicht sichtbar. Sie wird m. E. durchaus ausgeführt, jedoch in einer Instanz der Klasse TransferTest, die ja bei einem Doppelklick gebildet wird. 
Berichtigt mich, wenn ich da falsch liege. Ein Doppelklick auf das untere Panel führt übrigens zum gewünschten Ergebnis

Wie bekomme ich einen Wert aus dem Externen Panel in das PanelOben??

Leider sind es drei Klassen, aber so ist nun mal meine Programmstruktur.


```
package transfertest;

public class HauptFrame extends javax.swing.JFrame 
{
    public HauptFrame() 
    {
    setSize(600, 520);
    TransferTest tt = new TransferTest();
    add(tt);
    }
    
    public static void main(String args[]) 
    {
      new HauptFrame().setVisible(true);
    }
}




package transfertest;

import javax.swing.JPanel;

public class TransferTest extends JPanel
{
  private String data;
  private javax.swing.JPanel panelOben;
  private javax.swing.JPanel panelUnten;
  private javax.swing.JTextField textFieldOben;
  private javax.swing.JTextField textFieldUnten;
  ExternesPanel et = new ExternesPanel();
  
  public TransferTest() 
  { System.out.println("TransferTest gestartet");
    setSize(500, 520);
    setLayout(new java.awt.BorderLayout());
    textFieldOben = new javax.swing.JTextField();
    textFieldUnten = new javax.swing.JTextField();
    panelOben = new javax.swing.JPanel();
    panelUnten = new javax.swing.JPanel();
    textFieldOben.setText("Text Oben");
    textFieldOben.setText("Text Oben");
    textFieldUnten.setText("TextUnten");
    panelOben = new JPanel();
    panelOben.setPreferredSize(new java.awt.Dimension(490, 245));
    panelOben.setBackground(new java.awt.Color(102, 255, 104));
    panelOben.setBorder(javax.swing.BorderFactory.createTitledBorder("Panel Oben"));
    panelOben.add(textFieldOben);
    add(panelOben, java.awt.BorderLayout.NORTH);
    panelUnten = new JPanel();
    panelUnten.setPreferredSize(new java.awt.Dimension(490, 245));
    panelUnten.setBackground(new java.awt.Color(255, 255, 204));
    panelUnten.setBorder(javax.swing.BorderFactory.createTitledBorder("Panel Unten"));
    panelUnten.add(et, java.awt.BorderLayout.NORTH);
    panelUnten.add(textFieldUnten, java.awt.BorderLayout.SOUTH);
            panelUnten.addMouseListener(new java.awt.event.MouseAdapter() 
            {
                public void mouseClicked(java.awt.event.MouseEvent evt) {
                panelUntenMouseClicked(evt);
            }
        });
    add(panelUnten, java.awt.BorderLayout.SOUTH);
    validate();
    repaint();
    setVisible(true);
  }
  
    private void panelUntenMouseClicked(java.awt.event.MouseEvent evt) 
    {
       if( evt.getClickCount() == 2 )
       {
       System.out.println("Text Unten = "+textFieldUnten.getText());
       setData(textFieldUnten.getText());
       transferData();
       }
    }

    public String getData() 
    {   System.out.println("Gebe aus GetData den Wert "+data+" zurück");
        return data;
    }

    public void setData(String data) 
    {   System.out.println("Setze DATA auf den Wert +"+data);
        this.data = data;
    }

    public void transferData() 
    {   System.out.println("Habe in TransferData aus GetData den Wert "+data+" bekommen");
        textFieldOben.setText(getData());
        System.out.println("Funktion OK?");
    }
}






package transfertest;

import javax.swing.JPanel;

public class ExternesPanel extends JPanel
{
  private javax.swing.JTextField textFieldExtern;

  
public ExternesPanel()
{   System.out.println("Externes Panel gestartet");
    setPreferredSize(new java.awt.Dimension(200, 100));
    setLayout(new java.awt.BorderLayout());
    setBackground(new java.awt.Color(150, 150, 150));
    setBorder(javax.swing.BorderFactory.createTitledBorder("Externes Panel"));
    textFieldExtern = new javax.swing.JTextField();
    textFieldExtern.setPreferredSize(new java.awt.Dimension(50, 20));
    textFieldExtern.setText("Text vom externen Panel");
    add(textFieldExtern, java.awt.BorderLayout.SOUTH);
            addMouseListener(new java.awt.event.MouseAdapter() 
            {
                public void mouseClicked(java.awt.event.MouseEvent evt) 
                {
                panelUntenMouseDoubleClicked(evt);
                }
        });
}
    
      private void panelUntenMouseDoubleClicked(java.awt.event.MouseEvent evt) 
    {
       if( evt.getClickCount() == 2 )
       {TransferTest tt = new TransferTest();
       System.out.println("Textim Externen Panel = "+textFieldExtern.getText());
       tt.setData(textFieldExtern.getText());
       tt.transferData();
       }
    }  
}
```


----------



## 0x7F800000 (23. Feb 2008)

hey raptorrs, sorry, aber irgendwie werd ich das gefühl nicht los, dass du hier den code ein tick zu kompliziert (um nicht zu sagen "spaghettimäßig"  ) konzipiert hast...  :bae:

1) warum brauchst du denn alleine für die GUI 3 separate klassen? wenn du den ganzen kram einfach in eine packen würdest, hättest du auch keine probleme damit auf alle möglichen komponenten zuzugreifen, die du grad brauchst...

2) das hier ist 'ne imperative sprache, und *du* bist der allmächtige Imperator, warum hat jede mikroskopische zugriffsfunktion irgendetwas zu sagen? parlament? macht sich hier etwa demokratie breit oder was?  :lol: 
[ja, soll wohl beim debuggen behilflich sein, aber mich und andere leser hier bringts leider 0,0 µm weiter]

3) layout dürfte so nicht wirklich bleiben, aber ich nehm mal an, dass du eh vorhast das ganze zu überarbeiten..
[die farben sinnja grässlich  :bae: ]

Also am besten erzählst du nochmal detailliert was du da eigentlich vorhattest, dann kann man weiterschauen, ich blcik da momentan nicht wirklich durch... *auf die verfluchte uhr gug  :autsch: *


----------



## raptorrs (23. Feb 2008)

Also, was ich da zusammengezimmert habe, ist nur ein Skelett dessen, was da wirklich läuft.

Das Ganze wird nacher ein Programm zur Übergabe von Parametern an eine Maschinensteuerung Siemens S7-200.
(Dazu kommen auch noch Fragen)
Ein Produkt wird aus verschiedenen Teilen zusammengebaut. Abhängig von den benutzten Teilen fährt die Maschine immer an andere Montagepositionen.
Die Parameter für jedes Einzelteil werden vom Enduser der Maschine über eine GUI nachgepflegt. Jedes Einzelteil enthält max. 5 Parameter. Diese GUI entspricht dem oberen Panel aus dem Beispiel. Jede GUI enthält auch ein DatenPanel, auf welches eine Instanz einer JTable gesetzt wird. Das DatenPanel entspricht dem unteren Panel, Die JTable entspricht dem externen Panel. Für jedes Einzelteil gibt es ein TabbedPane, bestehend aus diesen Komponenten.

Nach Doppelklick auf eine Zeile in der JTable sollen die in dieser Zeile befindlichen Daten in die Eingabefelder der GUI (oberes Panel) kopiert werden.

Das hier gezeigte Beispiel hat also vom Layout her überhaupt nichts mit der späteren Anwendung zu tun, aber die Art, wie es programmiert ist, ist dem Beispiel sehr ähnlich!

Das ist bestimmt ein ganz simples Problem, ich komm nur nicht auf eine Lösung.


Bitte Leute, schaut Euch den Code noch mal an, OK?!

Und Du, Andrey, geh mal ein bisschen früher ins Bett!!!!! ;-)))


----------



## 0x7F800000 (23. Feb 2008)

okay, machen wirs mal andersherum... ich hab jetzt hier beim frühstücken ein wenig herumgebastelt, hab versucht das umzusetzen, was du in deinem allerersten beitrag geschrieben hast. Wolltest du so etwas in der art erhalten?


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

import javax.swing.event.*;

public class SiemensS7200_GUI extends JPanel implements MouseListener{
	
	//textfelder fürs obere panel
	JTextField[] textFields;
	//tabelle für die ScrollPane unten
	JTable table;
	
	//die gesamte gui konstruieren
	public SiemensS7200_GUI(){
		setLayout(new GridLayout(2,1));
		
		//text felder initialisieren
		textFields=new JTextField[5];
		
		//DAS OBERE PANEL 
		//beinhaltet im grunde nur das kleinere Panel mit Textfeldern
		//lässt platz für andere dinge frei, falls evtl was dazukommt...
		JPanel upperPanel=new JPanel();
		GridBagLayout upperPanelLayout=new GridBagLayout();
		upperPanel.setLayout(upperPanelLayout);
			//ein kleines Panel, das die Textfelder übereinander zeichnet
			JPanel textFieldPanel=new JPanel();
			textFieldPanel.setPreferredSize(new Dimension(200,100));
			textFieldPanel.setLayout(new GridLayout(textFields.length,1));
			for(int i=0; i<textFields.length; i++){
				textFields[i]=new JTextField(50);
				textFieldPanel.add(textFields[i]);
			}
			//das kleine panel im upper panel zentrieren
			GridBagConstraints textFieldPanel_gbc=new GridBagConstraints();
			textFieldPanel_gbc.anchor=GridBagConstraints.CENTER;
			textFieldPanel_gbc.fill=GridBagConstraints.NONE;
		upperPanelLayout.setConstraints(textFieldPanel, textFieldPanel_gbc);
		upperPanel.add(textFieldPanel);
		//okay, im oberen Panel ist alles soweit fertig, kann man in die GUI packen
		add(upperPanel);
		
		//DAS UNTERE PANEL
		//...also dieses ScrollPane mit tabelle
			//tabelle
			//daten irgendwoher laden, 
			//ich tipp die hier einfach zur veranschaulichung direkt ein...
			String tableData[][]=
			{		{"GetlingGun","9mm","300kg","Penetrator","17000$"},
					{"Kartoffelkanone","70mm","4kg","Kartoffel","30€"},
					{"BFG9000","20mm","12kg","Plasmabälle","unbezahlbar"}};
					
			String columnNames[]={"Spielzeug","Kaliber","Gewicht","Munitionstyp","Preis"};
			//[ich geh mal davon aus, dass ihr da irgendetwas nützlicheres herstellt ;) ]
			table=new JTable(tableData, columnNames);
			//mouse listener überträgt eine zeile in die textfelder
			table.addMouseListener(this);
		add(new JScrollPane(table));
		
	}
	
	//funktionalität des MouseListeners:
	public void mouseClicked(MouseEvent e) {
		for(int i=0; i<textFields.length; i++){
			textFields[i].setText((String)table.getValueAt(table.getSelectedRow(), i));
			
		}
	}
	
	//kram den man nie braucht...
	public void mouseEntered(MouseEvent e) {}
	public void mouseExited(MouseEvent e) {}
	public void mousePressed(MouseEvent e) {}
	public void mouseReleased(MouseEvent e) {}
	
	//test
	public static void main(String[] args){
		JFrame testFrame=new JFrame("S7-200 GUI Test");
		testFrame.setSize(500,300);
		testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		testFrame.getContentPane().add(new SiemensS7200_GUI());
		testFrame.setVisible(true);
	}
}
```

es geht jetzt nicht darum, ob die restliche funktionalität sich in diese version gut integrieren lässt, man kann das alles aufspalten wie man will, es geht erstmal einfach nur darum, ob ich richtig verstanden ahbe, was du da überhaupt anfangs herstellen wolltest...


----------



## raptorrs (26. Feb 2008)

@ Andrey

Ja, Andrey, Du hast es richtig verstanden. genau so soll es sein!

Ich witterte schon Morgenluft, den ich hatte den entsprechenden Mouselistener in die Klasse FlyerTable gesteckt. Jetzt habe ich ihn, genau wie in Deinem Code, erst an die Table gehängt, wenn sie auf das Panel (hier DataPanel) gesetzt wurde. Leider habe ich immer noch keine Funktion.
In der Klasse FlyerTable wird noch ein Model (extends AbstractTableModel) angehangen. Vielleicht ist das ja wichtig.

Hier mal der Code vom Klassenkopf der echten Anwendung:


```
public class FlyerPanel extends JPanel implements MouseListener
{
  String appName ;
  Dao dao = new Dao();
  FlyerTable dataTable = new FlyerTable();
  private Connection c;

  public FlyerPanel (String appName)
  { 
    this.appName = appName;
    initComponents ();
    setEditable(false);
    dataTable.setPreferredScrollableViewportSize(new Dimension(950,280));
        dataTable.addMouseListener(new java.awt.event.MouseAdapter() 
        {
            public void mouseDoubleClicked(java.awt.event.MouseEvent e) 
            {
                //Choose some method
                if(e.getClickCount()==2)
                {
                System.out.println("Tut sich was?");
                }
            }
        });
    JScrollPane sp = new JScrollPane();
    sp.getViewport().add(dataTable);
    dataPanel.setLayout( new BorderLayout());
    dataPanel.add(sp);
    dataTable.retrieveData();//holt einwandfrei Daten aus der DB
    sp.setViewportView(dataTable);//zeigt korrekt an
  }
```

Wie gesagt, die Table als solche funktioniert einwandfrei mit Datenexport, Sortierung etc. Bei Klick in eine Zeile wird die ganze Zeile markiert. 

Noch irgendwelche Ideen???

Danke auf jeden Fall schon mal in Voraus!!!


----------



## 0x7F800000 (26. Feb 2008)

sry raptorrs, diesmal konnte ich in deinem Beitrag nicht wirklich die frage herausfiltern, liegt evtl daran, dass ich den satz hier nicht so wirklich nachvollziehen kann


			
				raptorrs hat gesagt.:
			
		

> ... ich hatte den entsprechenden Mouselistener in die Klasse FlyerTable gesteckt. Jetzt habe ich ihn, genau wie in Deinem Code, erst an die Table gehängt, wenn sie auf das Panel (hier DataPanel) gesetzt wurde. Leider habe ich immer noch keine Funktion.


liegt wohl hauptsächlich daran, dass es em englischen keinen unterschied zwischen "ihn" "sie "es" "den" etc. gibt, wenn es um unbelebte Sachen wie Tabellen und MouseListener geht... Ich könnte nicht so wirklich nachvollziehen worum es da ging, weil ja die zuordnung der Genera mehr oder weniger willkürlich vorgenommen wurde  :lol: Und von was für einer Funktion ist die Rede? Sry, den Code Fand ich jetzt auch nicht sonderlich hilfreich, nun gut, ich seh da irgendeine Unterklase von JPanel, an die ein MouseListener drangehängt wurde, und jetzt?  :bahnhof:


----------



## raptorrs (26. Feb 2008)

OK, Andrey, der Reihe nach:

Die Klasse FlyerTable ist ja eine eine separate Klasse. für sich allein gestellt ohne Funktion. In dieser Klasse hatte ich einen MouseListener an die JTable gehängt. der hat in der Klasse für sich auch funktioniert. Auf der Console konnte ich die gewünschten Funktionen darstellen.

In der Klasse FlyerPanel wird nun eine Instanz der FlyerTable gebildet, nämlich "ft". Richtig war es (Deinem Beispiel folgend), den Mouselistener an die Instanz der FlyerTable zu hängen. das habe ich ja auch gemacht.

Als Funktion aus meinem Code (der, von dem ich nur den Klassenkopf dargestellt habe) erwarte ich eigentlich nur, dass bei einem Doppelklick auf eine x-beliebige Zeile von "ft" dieser Text "Tut sich was" ausgegeben wird.

Aber es tut sich sich rein garnichts. 

Die Frage ist also: Was ist falsch an meinem Code, warum spricht der MouseListener nicht an?


Übrigens: ich lese gerade noch mal nach: Der MouseListener hängt nicht an dem dataPanel, sondern an der dataTable!!!


----------



## Guest (26. Feb 2008)

Achso, es tut sich nix? okay, kann ich ja nich wissen, ich kanns ja nicht kompilieren, ohne 237 weitere klassen zu haben, die du in deinem projekt hast.  :bae: 

... Nun ja, was soll ich dazu sagen, wenn du meinen code ein wenig genauer betrachtest, stellst du fest, dass ich da nicht explizit nur doppelklicks erwarte... ehrlichgesagt hab ich es auch nicht geschafft, es so hinzubiegen, dass es ausschließlich auf doppelklicks reagiert. Allgemein erscheint mir das verhalten vom meinem eigenen beispielprogramm ein wenig unregelmäßig, mal tut sich sofort was, mal wird die zeile markiert, und es tut sich nix, mal wird ein eintrag editiert, und dann tut sich plötzlich wieder was... Aber ich habe nicht gedacht, dass diese doppelklicks so zentral sind  :roll: 

Wenn du nicht willst, dass beim einfachen herumklicken und editieren der einträge in der tabelle irgendetwas nach oben "transferiert" wird, könntest du dich vielleicht einfach damit begnügen, statt nur doppelklicks einfach nur die klicks mit der rechten maustaste abzufangen? Ich glaube kaum, dass es die steuerung wesentlich unkomfortabler machen würde, mit doppelklicks will da nun mal irgendetwas nicht funktionieren...  :bahnhof: 

Sry, ich hab die ganze zeit nicht kapiert, dass es dir konkret um doppelklicks geht...


----------



## raptorrs (28. Feb 2008)

Hab's hinbekommen!

Hatte man Andrey's code 1:1 übernehmen sollen! ;-)


```
public FlyerPanel ()
  { 
   
    initComponents ();
    dataTable.addMouseListener(this);
    dataTable.setPreferredScrollableViewportSize(new Dimension(950,280));

    JScrollPane sp = new JScrollPane();
    sp.getViewport().add(dataTable);
    dataPanel.setLayout( new BorderLayout());
    dataPanel.add(sp);
    dataTable.retrieveData();
    sp.setViewportView(dataTable);
  }

    public void mouseClicked(MouseEvent e) 
   {
         if(e.getClickCount()==2)
       {
        //Do something
       }
   }
```

Habe den MouseListener in (this) geändert und die entsprechende Methode passend gemacht.

Nun möchte ich doch wirklich gerne wissen, warum der eine Listener funktioniert und der andere nicht!

Dir, Andrey, herzlichen Dank. Der Kick zur Lösung des Problems kam von Dir!!


----------



## 0x7F800000 (28. Feb 2008)

raptorrs hat gesagt.:
			
		

> Nun möchte ich doch wirklich gerne wissen, warum der eine Listener funktioniert und der andere nicht!



wenn du diesen code hier meinst:


			
				raptorrs hat gesagt.:
			
		

> ```
> public void mouseDoubleClicked(java.awt.event.MouseEvent e)
> {
> //Choose some method
> ...


dann möchte *ich* aber zuerst ganz gerne wissen, woher eine solche methode überhaupt kommt  ???:L  hab eben in der Dokumentation nachgeschaut: weder der MouseListener noch der MouseAdapter weisen solch eine methode auf, das scheint deine eigene erfindung zu sein, die bei der verarbeitung der mausklicks nie herangezogen wird => rofl  :lol: 

na gut, jetzt funktioniert's endlich, das ist doch das wichtigste... :applaus:


----------

