Get/Set Werte Übergeben geht nicht und finde den fehler nicht.

Eklaf

Mitglied
Ich muß für die Schule ein EMail Programm schreiben und bei dem Übergeben der Werte mit geter Methoden hat dann ein Teil null werte und ich weiß nicht was ich falsch mache kann mir eventuell wer helfen?

Meine Main kurz und knackig:
Code:
package GUI;

public class Main_E_Mail 
{
	public static void main (String[]args)
	{
		Oberflaeche_Main OM = new Oberflaeche_Main();
		OM.los();
	}

}

Das ist die Main Oberfläche die sie Senden initialisiert und mit dem Button startet man dann die Benutzereingabeoberfläche:
Code:
package GUI;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import Programm.Senden;


public class Oberflaeche_Main extends JFrame implements ActionListener
{
	private JFrame mainFrame;
	private JPanel pnlNorth,pnlFrom,pnlTo,pnlBetreff;
	private JLabel lblFrom,lblTo,lblBetreff;
	private JTextField txtFFrom,txtFTo,txtFBetreff;
	private JTextArea txtAEingabe;
	private JButton btnSenden;
	
	Senden senden;
	
	public void los()
	{
		
		mainFrame=new JFrame("E-Mail versenden");//Mainframe erzeugen
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
		
		pnlNorth=new JPanel();
		pnlNorth.setLayout(new BoxLayout(pnlNorth, BoxLayout.Y_AXIS));
		
			pnlFrom=new JPanel();
			
				lblFrom=new JLabel("From: ");
				pnlFrom.add(lblFrom);
				
				txtFFrom=new JTextField(30);
				pnlFrom.add(txtFFrom);
			pnlNorth.add(pnlFrom);
			
			pnlTo=new JPanel();
				
				lblTo=new JLabel("To: ");
				pnlTo.add(lblTo);
				
				txtFTo= new JTextField(30);
				pnlTo.add(txtFTo);
			pnlNorth.add(pnlTo);
			
			pnlBetreff=new JPanel();
			
				lblBetreff=new JLabel("Betreff: ");
				pnlBetreff.add(lblBetreff);
				
				txtFBetreff=new JTextField(30);
				pnlBetreff.add(txtFBetreff);
			pnlNorth.add(pnlBetreff);
			
		mainFrame.getContentPane().add(BorderLayout.NORTH,pnlNorth);
				
		
		txtAEingabe=new JTextArea(20,20);
		mainFrame.getContentPane().add(BorderLayout.CENTER,txtAEingabe);
		
		btnSenden=new JButton("Senden");
		btnSenden.addActionListener(this);
		mainFrame.getContentPane().add(BorderLayout.SOUTH,btnSenden);
		
		mainFrame.setSize(600, 350);
		mainFrame.setVisible(true);
		
	}
	
	
	public void actionPerformed(ActionEvent e)
	{
		if (e.getSource()== btnSenden)
		{
			senden=new Senden();
			senden.setsFrom(txtFFrom.getText());
			senden.setsTo(txtFTo.getText());
			senden.setsSubjekt(txtFBetreff.getText());
			senden.setsText(txtAEingabe.getText());
			Oberflaeche_Benutzerdaten OberflBenutzerdaten =new Oberflaeche_Benutzerdaten();
			OberflBenutzerdaten.los();
		}
	}
		
}

Hier die Benutzereingabe Oberfläche:
Code:
package GUI;

import java.awt.BorderLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;

import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

import Programm.Senden;

public class Oberflaeche_Benutzerdaten extends JFrame implements ActionListener
{
	private JFrame mainFrame;
	private JPanel pnlCenter,pnlBenutzer,pnlPasswort,pnlHost,pnlPort;
	private JLabel lblBenutzer,lblPasswort,lblHost,lblPort;
	private JTextField txtFBenutzer,txtFPasswort,txtFHost,txtFPort;
	private JButton btnBestaetigen;
	
	Senden senden;
	
	public void los()
	{
		mainFrame=new JFrame("Benutzerdaten eingeben");//Mainframe erzeugen
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		pnlCenter=new JPanel();
		pnlCenter.setLayout(new BoxLayout(pnlCenter, BoxLayout.Y_AXIS));
		
			pnlBenutzer=new JPanel();
			
				lblBenutzer=new JLabel("Account Benutzername: ");
				pnlBenutzer.add(lblBenutzer);
				
				txtFBenutzer=new JTextField(15);
				pnlBenutzer.add(txtFBenutzer);
				pnlCenter.add(pnlBenutzer);
			
			pnlPasswort=new JPanel();
			
				lblPasswort=new JLabel("Account Passwort: ");
				pnlPasswort.add(lblPasswort);
				
				txtFPasswort=new JTextField(15);
				pnlPasswort.add(txtFPasswort);
				pnlCenter.add(pnlPasswort);
			
			pnlHost =new JPanel();
			
				lblHost=new JLabel("Host z.B. mail.gmx.de : ");
				pnlHost.add(lblHost);
				
				txtFHost=new JTextField(15);
				pnlHost.add(txtFHost);
				pnlCenter.add(pnlHost);
			
			pnlPort= new JPanel();
			
				lblPort= new JLabel("Port z.B. 25 : ");
				pnlPort.add(lblPort);
				
				txtFPort=new JTextField(15);
				pnlPort.add(txtFPort);
				pnlCenter.add(pnlPort);
		
		mainFrame.getContentPane().add(BorderLayout.CENTER,pnlCenter);
		
		btnBestaetigen=new JButton("Bestätigen");
		btnBestaetigen.addActionListener(this);
		mainFrame.getContentPane().add(BorderLayout.SOUTH,btnBestaetigen);
		
		mainFrame.setSize(350, 200);
		mainFrame.setVisible(true);
	}
	
	public void actionPerformed(ActionEvent e)
	{
		if (e.getSource()== btnBestaetigen)
		{
			senden =new Senden();
			senden.setsUser(txtFBenutzer.getText());
			senden.setsPassword(txtFPasswort.getText());
			senden.setsHost(txtFHost.getText());
			senden.setsPort(txtFPort.getText());
			senden.Werteausgeben();
			try 
			{
				senden.MailSenden();
			} 
			catch (AddressException e1) 
			{
				e1.printStackTrace();
			} 
			catch (MessagingException e2) 
			{			
				e2.printStackTrace();
			}
			
		}
	}
}

Und zu guter letzt die Klasse für das versenden die von der Benutzereingabe gestartet wird und die auch die ganzen getter und setter hat:

Code:
package Programm;

import java.util.Properties;

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

import GUI.Oberflaeche_Main;

public class Senden 
{
	String sFrom;		//von
	String sTo;			//an
	String sSubjekt;	//Betreff
	String sText;		//Text
	String sUser;		//Benutzer
	String sPassword; 	//Password
	String sHost;		//Host
	String sPort;		//Port
	
	Oberflaeche_Main GUIMain =new Oberflaeche_Main();
	
	
	public void Werteausgeben()
	{
		System.out.println(""+getsFrom());
		System.out.println(""+getsTO());
		System.out.println(""+getsSubjekt());
		System.out.println(""+getsText());
		System.out.println(""+getsUser());
		System.out.println(""+getsPassword());
		System.out.println(""+getsHost());
		System.out.println(""+getsPort());
	}

  public void MailSenden() throws AddressException,MessagingException
  {
	    Properties props = new Properties();
	    props.put("mail.smtp.auth", "true");
	    props.put("mail.smtp.host", getsHost());
	    props.put("mail.smtp.port", getsPort());
	
	    Session session = Session.getDefaultInstance(props,null);
	    
	    Message msg = new MimeMessage(session);
	    msg.setFrom(new InternetAddress(getsFrom()));
	    msg.setRecipient(Message.RecipientType.TO, new InternetAddress(getsTO()));
	    msg.setSubject(getsSubjekt());
	    msg.setText(getsText());	    
	
	    Transport tr=new session.getTransport("smtp");
	    tr.connect(getsHost(),getsUser(),getsHost());
	    msg.saveChanges();
	    tr.sendMessage(getsText(),msg.getAllRecipients());
	    tr.close();
  }  
	  public void setsFrom(String p_sfrom)
	  {
		  sFrom=p_sfrom;
	  }
	  public void setsTo(String p_sto)
	  {
		  sTo=p_sto;
	  }
	  public void setsSubjekt(String p_ssubjekt)
	  {
		  sSubjekt=p_ssubjekt;
	  }
	  public void setsText(String p_sText)
	  {
		  sText=p_sText;
	  }
	  public String getsFrom()
	  {
		  return sFrom;
	  }
	  public String getsTO()
	  {
		  return sTo;
	  }
	  public String getsSubjekt()
	  {
		  return sSubjekt;
	  }
	  public String getsText()
	  {
		  return sText;
	  }
	  public void setsUser(String p_sUser)
	  {
		  sUser=p_sUser;
	  }
	  public void setsPassword(String p_sPW)
	  {
		  sPassword=p_sPW;
	  }
	  public void setsHost(String p_sHost)
	  {
		  sHost=p_sHost;
	  }
	  public void setsPort(String p_sPort)
	  {
		  sPort=p_sPort;
	  }
	  
	  public String getsUser()
	  {
		  return sUser;
	  }
	  public String getsPassword()
	  {
		  return sPassword;
	  }
	  public String getsHost()
	  {
		  return sHost;
	  }
	  public String getsPort()
	  {
		  return sPort;
	  }
	
}

Ich bin für jede Hilfe dankbar.

CU Eklaf
 

Eklaf

Mitglied
Falls du die Throws meinst die werden in der Benutzeroberfläche aufgefangen sonst weiß ich nicht was du meinst ich programiere erst seit ca 10 monaten
 

CPoly

Mitglied Weizenbier
Er meint damit folgendes:

Du wirfst uns hier zeilenweise Code an den Kopf, sagst aber nicht welche Zeile Probleme macht bzw. welche Werte null sind, obwohl sie es nicht sein sollten.
 

Eklaf

Mitglied
Oh mist mein Fehler sry^^ also im letzten Code block sollen die ganzen Strings ja Zwischengespeichert werden und dann am ende auch benutzt werden allerdings die Strings From, To, Subjekt und Text die von der Oberflaeche_Main (2ter Codeblock) übergeben werden sind alle null nur die von der Oberflaeche_Benutzereingabe (3ter Codeblock) werden korrekt übergeben. woran liegt das?
 

sheel

I love Asm
Du...
-machst in der Oberfläche_Main ein neues Objekt von Senden
-Weist 4 von 8 benötigten Werten zu
-Startest den Oberfläche_Benutzerdaten-Teil
-Erzeugst wieder ein Objekt von Senden
-Und weist dem die anderen 4 Werte zu

Merkst du was? :D

Die "Senden" in Oberfläche_Main und Oberfläche_Benutzerdaten sind zwei verschiedene.
Dem ersten weist du die vier einen Werte zu, dem zweiten die 4 anderen.
Weiterverwendet von dir wird das zweite, dem natürlich die Werte vom ersten fehlen.

Im Oberfläche_Benutzerdaten (beim actionperformed) darfst du kein "...=new Senden();" machen, denn ein neues Senden hast du schon im Oberfläche_Main.

Übergib das Senden vom Main einfach in die Benutzerdaten, egal ob im Konstruktor oder im los()
Konstruktor/Los() weist dann den übergebenen Wert der Variable senden zu, dafür kommt das "senden=new Senden();" in den Benutzerdaten weg.

Gruß
 

Eklaf

Mitglied
Das hatte ich mir schon fasst gedacht dass das 2te new zuviel ist :)
Okay ich hab versucht was dazu zu finden aber ich bin zu d... wie geht das hab ich noch nie gemacht. kannst mir da bitte weiterhelfen?
 

sheel

I love Asm
1) Im Oberflaeche_Main, actionPerformed, letzte Codezeile schreibst du statt
Java:
OberflBenutzerdaten.los();
das:
Java:
OberflBenutzerdaten.los(senden);

2) Im Oberflaeche_Benutzerdaten musst du beim los eintragen dass es einen Parameter bekommt.
Außerdem solltest du die Variable senden protected oder private machen.
Im los musst du dann das übergebene Senden der Variable zuweisen, damits auch noch im actionPerformed verfügbar ist.
Also
Java:
Senden senden;

public void los()
{
//...
wird zu
Java:
private Senden senden;

public void los(Senden variable)
{
    senden=variable;
    //...Hier der restliche Code von los, kannst du unverändert stehenlassen

3) Auch im Oberflaeche_Benutzerdaten, bei actionPerformed
kommt die Zeile ersatzlos weg:
Java:
senden=new Senden();

Fertig
 

Eklaf

Mitglied
AAAAAAAAAAAAHHHHHHHHHHHHHHHHH geil es geht dank dir vielmals jetzt kann ich wieder ruhig schlafen ;) danke danke danke

bis zum nächsten mal ;)
 

MiMi

Erfahrenes Mitglied
Neben dem Antworten Button ist ein Haeckchen, um das Thema als erledigt zu markieren :) Den darf man ohne Probleme benutzen :)