# Textfeld auslesen



## 1342 (1. Nov 2010)

Hallo zusammen, ich habe ein Problem.

Und zwar habe ich ein Programm mit zwei Klassen innerhalb eines Packages. In einem der beiden ist die GUI (mit Jigloo erstellt). In der GUI sind Textfelder. Ich möchte nun die Textfelder als String auslesen und in der anderen Klasse verwenden. 

Das klappt eigentlich auch, nur bekomme ich nicht den Text den ich ins Textfeld geschrieben habe, sondern den Text, der am Anfang drin steht (Textfeldbezeichnung).

Wenn ich es in der GUI Klasse mache, dann funktioniert es.

Hier der relevante Code:

Andere Klasse:


```
public void mclass() {
	  
	  
	  	GUIEmail GUI =new GUIEmail();//Objekt, mit dem ich den Text von der GUI-Klasse hole
		
		
		String from = GUI.absender.getText();
}
```

GUI Klasse:

```
public class GUIEmail extends javax.swing.JFrame {
	
	public JTextField absender;
	public JTextField betreff;
	public JTextField text;
	public JButton senden;
	public JTextField password;
	public JTextField benutzer; 
	public JTextField empfaenger;
	public String von;
	
	

	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args)throws Exception {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				GUIEmail inst = new GUIEmail();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}
	
	public GUIEmail() {
		super();
		initGUI();
	}
	
	public void initGUI() {
		try {
			
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(null);
			{
				absender = new JTextField();
				getContentPane().add(absender, "Center");
				absender.setText("Absender");
				absender.setBounds(0, 61, 484, 23);
				absender.setEditable(true);
				
			}
```

Sourcecode geht noch weiter ist aber unwichtig.

Vielleicht hat jemand ne Idee???

Danke, Gruß


----------



## DarkWizzard (1. Nov 2010)

Hi,

Wenn ich das jetzt richtig sehe, erstellst du in der Methode mclass() deine GUI und speicherst direkt danach den Text aus dem Textfeld in deinem from-String.

Die Zeile


```
String from = GUI.absender.getText();
```

holt sich genau zu dem Zeitpunkt, an dem sie ausgeführt wird einmalig den Text aus dem Textfeld. Es wird da nichts verknüpft und der String wird nicht automatisch aktualisiert wenn du etwas im Textfeld änderst. Und da du den Text sofort nach der Erstellung der GUI abfragst hatte der Benutzer noch gar keine Möglichkeit den Text zu ändern bevor er in dem String gespeichert wird.

Du müsstest diese Zeile erst dann ausführen, wenn du den Text auch wirklich brauchst, also beispielsweise wenn der Benutzer auf "senden" drückt.


Gruß,
DarkWizzard


----------



## Haymaker84 (1. Nov 2010)

kann meinem Vorredner nur zustimmen.

man brauch entweder einen Button mit Actionlistener, um an einem vom Benutzer bestimmeten Zeitpunkt den Text auszulesen
... oder ...
automatisch bei (jedem) Tastendruck mit einem Key- oder Documentlistener.

Auf jeden Fall sind Listerner das richtige Schlagwort!


----------



## 1342 (1. Nov 2010)

Hallo ihr zwei,

danke für eure Antworten.

Ich habe im weiteren Code genau so einen Button der genau das machen soll, allerdings hab ich dort das selbe Problem. 

Ich hole zwar den Text aus der GUI Klasse, aber eben nur der Text der am Anfang drin steht.

Ich poste mal den ganzen Code, sonst gibt es nur Verwirrungen.

GUIKlasse:

```
package email;

import java.awt.BorderLayout;


import javax.swing.JButton;
import javax.swing.JTextField;

import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit [url=http://www.cloudgarden.com]Cloud Garden (Java Resources)[/url] for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class GUIEmail extends javax.swing.JFrame {
	
	public JTextField absender;
	public JTextField betreff;
	public JTextField text;
	public JButton senden;
	public JTextField password;
	public JTextField benutzer; 
	public JTextField empfaenger;
	public String von;
	
	

	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args)throws Exception {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				GUIEmail inst = new GUIEmail();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}
	
	public GUIEmail() {
		super();
		initGUI();
	}
	
	public void initGUI() {
		try {
			
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(null);
			{
				absender = new JTextField();
				getContentPane().add(absender, "Center");
				absender.setText("Absender");
				absender.setBounds(0, 61, 484, 23);
				absender.setEditable(true);
				von = absender.getText();
			}
			{
				empfaenger = new JTextField();
				getContentPane().add(empfaenger, "North"); 
				empfaenger.setText("Empfänger");
				empfaenger.setBounds(0, 92, 484, 23);
			}
			{
				benutzer = new JTextField();
				getContentPane().add(benutzer, "North");
				benutzer.setText("Benutzer");
				benutzer.setBounds(0, 5, 484, 23);
			}
			{
				password = new JTextField();
				getContentPane().add(password, "North");
				password.setText("Password");
				password.setBounds(0, 34, 484, 23);
			}
			{
				betreff = new JTextField();
				getContentPane().add(betreff, "North");
				betreff.setText("Betreff");
				betreff.setBounds(0, 121, 484, 23);
			}
			{
				text = new JTextField();
				getContentPane().add(text, "North");
				text.setLayout(null);
				text.setText("Text");
				text.setBounds(0, 150, 484, 147);
			}
			{
				senden = new JButton();
				getContentPane().add(senden);
				senden.setText("Senden");
				senden.setBounds(212, 309, 53, 23);
				senden.addActionListener(new aListener());
			}
			
			
			pack();
			setSize(500, 400);
		} catch (Exception e) {
		    //add your error handling code here
			e.printStackTrace();
		}
	}
	
	 public class aListener implements ActionListener // Interne Klasse aListener 
		{		
	    			
			
			public void actionPerformed(ActionEvent e) // Methode actionPerformed
			{
				GUIEmail GUI =new GUIEmail();
				String Label = GUI.senden.getActionCommand();
				
				
			   
				
				//String Label; // Attribut
				Label = e.getActionCommand(); // Den Namen des auslösenden Objektes in "Label" speichern

				if(Label.equals("Senden")) // Wird ausgeführt wenn "Beenden" betätigt wurde
				{
					
					MainClass sendklasse = new MainClass();
					
					sendklasse.mclass();
						
					
					
					
				}  
			}
		}
	
	
}
```

Main KLasse: (Die heisst nur Main KLasse, die echte Main-KLasse ist in der GUI)

```
package email;


import java.util.Properties;

import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class MainClass {

  public void mclass() {
	  
	  try{
	  	GUIEmail GUI =new GUIEmail();
		
		
		String from = GUI.absender.getText(); 
		String to = GUI.empfaenger.getText();
		String subject = GUI.betreff.getText();
		String text = GUI.text.getText();
		String user = GUI.benutzer.getText();
		String password = GUI.password.getText();
		String host ="mail.gmx.de";
		Properties props = new Properties();
	    props.put("mail.smtp.auth", "true");
	    props.put("mail.smtp.host", "mail.gmx.de");
	    props.put("mail.smtp.port", "25");

	    Session session = Session.getDefaultInstance(props, null);
	    Message msg = new MimeMessage(session);

	    Address a = new InternetAddress(from); 
	    Address b = new InternetAddress(to);

	    msg.setContent("Mail contect", "text/plain"); 
	    msg.setFrom(a);
	    msg.setRecipient(Message.RecipientType.TO, b);
	    msg.setSubject(subject);
	    msg.setText(text);
	    Transport tr = session.getTransport("smtp");
	    tr.connect(host, user, password);
	    msg.saveChanges();
	    tr.sendMessage(msg, msg.getAllRecipients());
	    tr.close();
	    System.out.println("E-Mail wurde verschickt an" + to);
	    
	    Transport.send(msg);
	  }
	  catch (Exception e) {
		    //add your error handling code here
			e.printStackTrace();
  	}
  }
	    public void schicken() { 
	    	try{
	    		GUIEmail GUI =new GUIEmail();
	    		System.out.println(GUI.von);
	    	    	
	    	}
	    	catch (Exception e) {
			    //add your error handling code here
				e.printStackTrace();
	    	}}
   
  }
```

Das ist jetzt halt mehr zum lesen, aber man braucht das wahrscheinlich um die Zusammenhänge zu erkennen.

Das Programm ist ein Mail - Programm.

Verschicken kann ich eine e-Mail schon, aber nur ohne Oberfläche.
Diese wollte ich jetzt noch dazu bauen, aber irgendwie hänge ich fest.

Danke nochmal, Gruß


----------



## Clahboid (1. Nov 2010)

Das Problem ist, dass du in jeder Methode deiner MainClass als erstes ein neues Gui-Objekt anlegst und dann von diesem den Absender, Text usw. abfragst. Hier steht dann natürlich der initialiserte Wert.


----------



## 1342 (1. Nov 2010)

Okay, aber dieses Objekt brauche ich ja, um die Werte aus der GUI-Klasse zu holen, oder?

Gibt es noch andere Methoden um Werte aus einem Textfeld in eine andere Klasse zu holen?


----------



## DarkWizzard (1. Nov 2010)

Genau, du brauchst das Objekt. Aber genau das, und nicht irgendein neues.
Du kannst also zum Beispiel das erstellte Objekt dem Konstruktor deiner Main Klasse übergeben. Da musst du dann darauf zugreifen und nicht immer ein neues Objekt erstellen.

Ich hab das jetzt mal so wenig wie möglich geändert:


```
package email;
 
import java.awt.BorderLayout;
 
 
import javax.swing.JButton;
import javax.swing.JTextField;
 
import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
 
/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit [url=http://www.cloudgarden.com]Cloud Garden (Java Resources)[/url] for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class GUIEmail extends javax.swing.JFrame {
    
    public JTextField absender;
    public JTextField betreff;
    public JTextField text;
    public JButton senden;
    public JTextField password;
    public JTextField benutzer; 
    public JTextField empfaenger;
    public String von;
    publiv GUIEmail inst;
    
    
 
    /**
    * Auto-generated main method to display this JFrame
    */
    public static void main(String[] args)throws Exception {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                inst = new GUIEmail();
                inst.setLocationRelativeTo(null);
                inst.setVisible(true);
            }
        });
    }
    
    public GUIEmail() {
        super();
        initGUI();
    }
    
    public void initGUI() {
        try {
            
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            getContentPane().setLayout(null);
            {
                absender = new JTextField();
                getContentPane().add(absender, "Center");
                absender.setText("Absender");
                absender.setBounds(0, 61, 484, 23);
                absender.setEditable(true);
                von = absender.getText();
            }
            {
                empfaenger = new JTextField();
                getContentPane().add(empfaenger, "North"); 
                empfaenger.setText("Empfänger");
                empfaenger.setBounds(0, 92, 484, 23);
            }
            {
                benutzer = new JTextField();
                getContentPane().add(benutzer, "North");
                benutzer.setText("Benutzer");
                benutzer.setBounds(0, 5, 484, 23);
            }
            {
                password = new JTextField();
                getContentPane().add(password, "North");
                password.setText("Password");
                password.setBounds(0, 34, 484, 23);
            }
            {
                betreff = new JTextField();
                getContentPane().add(betreff, "North");
                betreff.setText("Betreff");
                betreff.setBounds(0, 121, 484, 23);
            }
            {
                text = new JTextField();
                getContentPane().add(text, "North");
                text.setLayout(null);
                text.setText("Text");
                text.setBounds(0, 150, 484, 147);
            }
            {
                senden = new JButton();
                getContentPane().add(senden);
                senden.setText("Senden");
                senden.setBounds(212, 309, 53, 23);
                senden.addActionListener(new aListener());
            }
            
            
            pack();
            setSize(500, 400);
        } catch (Exception e) {
            //add your error handling code here
            e.printStackTrace();
        }
    }
    
     public class aListener implements ActionListener // Interne Klasse aListener 
        {       
                    
            
            public void actionPerformed(ActionEvent e) // Methode actionPerformed
            {
                GUIEmail GUI =new GUIEmail();
                String Label = GUI.senden.getActionCommand();
                
                //String Label; // Attribut
                Label = e.getActionCommand(); // Den Namen des auslösenden Objektes in "Label" speichern
 
                if(Label.equals("Senden")) // Wird ausgeführt wenn "Beenden" betätigt wurde
                {
                    MainClass sendklasse = new MainClass();
                    
                    sendklasse.mclass(inst);
                }  
            }
        }
}
```



```
package email;
 
 
import java.util.Properties;
 
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

private GUIEmail GUI;
 
public class MainClass {
 
  public void mclass(GUIEmail gui) {
      
      try{
        GUI = gui;
        
        
        String from = GUI.absender.getText(); 
        String to = GUI.empfaenger.getText();
        String subject = GUI.betreff.getText();
        String text = GUI.text.getText();
        String user = GUI.benutzer.getText();
        String password = GUI.password.getText();
        String host ="mail.gmx.de";
        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", "mail.gmx.de");
        props.put("mail.smtp.port", "25");
 
        Session session = Session.getDefaultInstance(props, null);
        Message msg = new MimeMessage(session);
 
        Address a = new InternetAddress(from); 
        Address b = new InternetAddress(to);
 
        msg.setContent("Mail contect", "text/plain"); 
        msg.setFrom(a);
        msg.setRecipient(Message.RecipientType.TO, b);
        msg.setSubject(subject);
        msg.setText(text);
        Transport tr = session.getTransport("smtp");
        tr.connect(host, user, password);
        msg.saveChanges();
        tr.sendMessage(msg, msg.getAllRecipients());
        tr.close();
        System.out.println("E-Mail wurde verschickt an" + to);
        
        Transport.send(msg);
      }
      catch (Exception e) {
            //add your error handling code here
            e.printStackTrace();
    }
  }
        public void schicken() { 
            try{
                System.out.println(GUI.von);
                    
            }
            catch (Exception e) {
                //add your error handling code here
                e.printStackTrace();
            }}
   
  }
```


Und die Überprüfung im ActionListener kannst du weg lassen, kann ja nur von dem Button ausgelöst werden.


Edit: Habs verbessert.


----------



## 1342 (1. Nov 2010)

danke erstmal, 

aber wenn ich die Änderungen so eintippe, dann bekomme ich bei:

```
if(Label.equals("Senden")) // Wird ausgeführt wenn "Beenden" betätigt wurde
				{
					
					MainClass sendklasse = new MainClass(inst);
					
					sendklasse.mclass();
						
					
					
					
				}
```
 eine Fehlermeldeung

Bei MainClass sendklasse......... kommt "The Construktor MainClass(GUIEmail) is undefined"

Bei sendklasse.....kommt"The method mclass(GUIEmail) in the type MainClass is not applicable for the arguments ()"


----------



## Clahboid (1. Nov 2010)

So sollte es laufen:

```
if(Label.equals("Senden")) // Wird ausgeführt wenn "Beenden" betätigt wurde
				{
					
					MainClass sendklasse = new MainClass();
					
					sendklasse.mclass(inst);
						
					
					
					
				}
```


----------



## DarkWizzard (1. Nov 2010)

Stimmt, sorry. Da hatte ich das in den Constructor gepackt statt in die Methode...


----------



## 1342 (1. Nov 2010)

Aha, da tut sich schon mehr würd ich sagen, danke!

aber jetzt bekomm ich ne Null Pointer Exception :-(

```
java.lang.NullPointerException
	at email.MainClass.mclass(MainClass.java:23)
	at email.GUIEmail$aListener.actionPerformed(GUIEmail.java:147)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```


----------



## DarkWizzard (1. Nov 2010)

Oh man, heut steh ich aber auch auf dem Schlauch. Ist klar...

Mach mal in dem ActionListener diese Zeile hier weg:


```
GUIEmail GUI =new GUIEmail();
```

Die hab ich noch übersehen.


----------

