Swing Zwei Klassen mit Textfeld Eingaben vergleichen und Ausgabe erzeugen

Alex2013

Bekanntes Mitglied
Hallo Leute,

nach einer etwas längeren Java Abstinenzphase habe ich mich jetzt wieder etwas mehr damit beschäftigt und stehe vor einem Problem. Ich habe zwei Klassen Partner_match und -match2.
In der ersten Klasse ist ebenfalls die main Methode implementiert. Das ich die zweite Klasse aus der ersten heraus aufrufe und auch die Eingaben tätigen kann, das klappt soweit alles. Nur nachdem ich die Eingabe tätige und weiter bzw. anschließend ok drücke, passiert nichts mehr. Ich möchte aber, dass beide Eingaben miteinander verglichen werden und anschließend bei Übereinstimmung oder auch nicht Übereinstimmung in einem JOptionPane eine Meldung ausgegeben wird, was übereinstimmt und was nicht.

Hier einmal die Klasse1 (die zweite ist im Prinzip genauso aufgebaut):
Java:
[code]
package partner_finden;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

public class Partner_match extends JFrame implements ActionListener
{
	private static final long serialVersionUID = 1L;
	JLabel l1,l2,l3,l4,l5,l6,l7,l8,l9,l10;
	JTextField tf1,tf2,tf3,tf4,tf5,tf6,tf7,tf8,tf9,tf10;
	JRadioButton rb1,rb2;
	JButton b1,b2,b3;
	Container c;
	
	public Partner_match(String titel)
	{
		c=getContentPane();
		setLayout(new GridLayout(10,2));
		setTitle("Partner finden V2");
		l1=new JLabel("Name: ", JLabel.RIGHT);
		l2=new JLabel("Land: ",JLabel.RIGHT);
		l3=new JLabel("Beruf: ",JLabel.RIGHT);
		l4=new JLabel("Wohnort: ",JLabel.RIGHT);
		l5=new JLabel("Geburtsdatum: ",JLabel.RIGHT);
		l6=new JLabel("Haarfarbe: ",JLabel.RIGHT);
		l7=new JLabel("Augenfarbe: ",JLabel.RIGHT);
		l8=new JLabel("Groesse: ",JLabel.RIGHT);
		tf1=new JTextField();
		tf2=new JTextField();
		tf3=new JTextField();
		tf4=new JTextField();
		tf5=new JTextField();
		tf6=new JTextField();
		tf7=new JTextField();
		tf8=new JTextField();
		rb1=new JRadioButton("maennlich");
		rb2=new JRadioButton("weiblich");
		b1=new JButton("Abbrechen");
		b2=new JButton("Weiter");
		b1.addActionListener(this);
		b2.addActionListener(this);
		c.add(rb1);c.add(rb2);c.add(l1);c.add(tf1);c.add(l2);c.add(tf2);c.add(l3);c.add(tf3);
		c.add(l4);c.add(tf4);c.add(l5);c.add(tf5);c.add(l6);c.add(tf6);c.add(l7);c.add(tf7);
		c.add(l8);c.add(tf8);c.add(b1);c.add(b2);
		rb1.setSelected(true);
		setSize(250, 500);
		setResizable(false);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) 
	{
		new Partner_match("Partner finden V2");
	}
	
	@Override
	public void actionPerformed(ActionEvent ae) 
	{
		//zunächst werden die Eingaben getätigt
		//anschließend wird weiter gedrückt und die Message Box erscheint
		if(ae.getActionCommand().equals("Weiter"))
		{
			String ausgabe="Partner 1"+"\n"+"Name: "+tf1.getText()+"\n"+"Land: "+tf2.getText()+"\n"+"Beruf: "+tf3.getText()+"\n"+"Wohnort: "+tf4.getText()+"\n"+"Geburtsdatum: "+tf5.getText()+
					"\n"+"Haarfarbe: "+tf6.getText()+"\n"+"Augenfarbe: "+tf7.getText()+"\n"+"Groesse: "+tf8.getText();
			JOptionPane.showMessageDialog(null, ausgabe,"Ergebnis",JOptionPane.INFORMATION_MESSAGE);
			dispose();
		}
		
		new Partner_match2("Partner 2");
		//wie kann ich hier die Eingaben der beiden Klassen miteinander vergleichen
		//ohne die if abfrage funktioniert es. nur eben gibt es keine Ausgabe wie gewünscht
		if(Partner_match.this.equals(Partner_match2.class))
		{
			JOptionPane.showMessageDialog(null,"Sie passen gut zusammen :-)","Ergebnis",JOptionPane.INFORMATION_MESSAGE);//String ausgabe="";
		}
	}
}
[/code]

Hat hier evtl. jemand einen Rat oder einen Tipp?

Für Antworten wäre ich dankbar.

Lg
 
Ich habe zwei Klassen Partner_match und -match2.

Worin unterscheiden sich die beiden Klassen? Gibt es überhaupt einen Unterschied? Wenn nein, dann wirf die eine Klasse weg! Und entferne auch den "_" aus dem Klassennamen, sollte man nicht machen.

Nur nachdem ich die Eingabe tätige und weiter bzw. anschließend ok drücke, passiert nichts mehr. Ich möchte aber, dass beide Eingaben miteinander verglichen werden und anschließend bei Übereinstimmung oder auch nicht Übereinstimmung in einem JOptionPane eine Meldung ausgegeben wird, was übereinstimmt und was nicht.

Deine Umsetzung zu diesem Problem ist generell falsch. Das Problem ist das du ein Fenster öffnest welches wiederrum ein anderes Fenster öffnet (zwischen beiden gibt es keine!! Verbindung). Und bei beiden Eingaben tätigen kannst. Mehr macht dein Code nicht.

Du brauchst eine Klasse "zum Daten halten", welche dir ein Objekt "Partner" bzw. "Person" beschreibt. Die Daten für Objekte dieser Klasse kannst du per GUI eingeben (das hast du ja schon).

Am besten wäre zuerst mal nur eine Klasse zu entwerfen welche eine Person/Partner abbildet. Diese dann zu vergleichen, und dann kannst du wieder die GUI dazu geben.

Hier ein kleiner Ansatz:
Java:
public static void main(String[] args) {
    Person p1 = new Person(......);
    Person p2 = new Person(......);
    if(p1.equals(p2)) {
        // Konsolenausgabe das p1 und p2 gleich sein
    }
...
}

Java:
package partner_finden;

public class Partner_match extends JFrame implements ActionListener

Wie schon oben gesagt "_" im Klassennamen sind nicht so schön, auch nicht bei Packages.
Des Weiteren, leite nicht von JFrame ab wenn du diese Klasse nicht erweitern willst! Erstelle dir stattdessen ein Objekt von JFrame und arbeite mit diesem.


Java:
	JLabel l1,l2,l3,l4,l5,l6,l7,l8,l9,l10;
	JTextField tf1,tf2,tf3,tf4,tf5,tf6,tf7,tf8,tf9,tf10;
	JRadioButton rb1,rb2;
	JButton b1,b2,b3;
	Container c;

1. Es ist nicht schön alle GUI Element als Klassen Variablen zu halten
2. Wenn du es machst gib diesen Attributen sprechende Namen, woher soll jemand anderes wissen was "l1" oder "l2" genau sind? Auch du wirst dir leichter tun sobald die Programme komplexer werden!

Java:
	public Partner_match(String titel)
	{
		c=getContentPane();
		setLayout(new GridLayout(10,2));
		setTitle("Partner finden V2");
		l1=new JLabel("Name: ", JLabel.RIGHT);
		l2=new JLabel("Land: ",JLabel.RIGHT);
		l3=new JLabel("Beruf: ",JLabel.RIGHT);
		l4=new JLabel("Wohnort: ",JLabel.RIGHT);
		l5=new JLabel("Geburtsdatum: ",JLabel.RIGHT);
		l6=new JLabel("Haarfarbe: ",JLabel.RIGHT);
		l7=new JLabel("Augenfarbe: ",JLabel.RIGHT);
		l8=new JLabel("Groesse: ",JLabel.RIGHT);
		tf1=new JTextField();
		tf2=new JTextField();
		tf3=new JTextField();
		tf4=new JTextField();
		tf5=new JTextField();
		tf6=new JTextField();
		tf7=new JTextField();
		tf8=new JTextField();
		rb1=new JRadioButton("maennlich");
		rb2=new JRadioButton("weiblich");
		b1=new JButton("Abbrechen");
		b2=new JButton("Weiter");
		b1.addActionListener(this);
		b2.addActionListener(this);
		c.add(rb1);c.add(rb2);c.add(l1);c.add(tf1);c.add(l2);c.add(tf2);c.add(l3);c.add(tf3);
		c.add(l4);c.add(tf4);c.add(l5);c.add(tf5);c.add(l6);c.add(tf6);c.add(l7);c.add(tf7);
		c.add(l8);c.add(tf8);c.add(b1);c.add(b2);
		rb1.setSelected(true);
		setSize(250, 500);
		setResizable(false);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

Schreibe nicht alles in den Konstruktor sondern teile den Code in Methode auf (natürlich das es logisch noch Sinn macht). Schreibe jeden Befehl in eine eigene Zeile, Code wird dadurch länger aber lesbarer!

Du führst ziemlich oft die gleichen Befehle aus (JLabel erstellen) versuche das in eigenen Methoden zu kapseln:
Java:
public Partner_match(String titel) {
    ....
    addJLabel("Name: ");
}

private void addLabel(String text) {
    JLabel l = new JLabel(text, JLabel.RIGHT);
    c.add(l);
}


Java:
	@Override
	public void actionPerformed(ActionEvent ae) 
	{
....	
		new Partner_match2("Partner 2");
		//wie kann ich hier die Eingaben der beiden Klassen miteinander vergleichen
		//ohne die if abfrage funktioniert es. nur eben gibt es keine Ausgabe wie gewünscht
		if(Partner_match.this.equals(Partner_match2.class))
		{
....
		}
	}
}

Hier liegt das Problem darin das du deine 2.Klasse aufrufst. Deren Fenster öffnet sich und du kannst dort ebenfalls Eingaben tätigen.
Dein if überprüft dann einfach irgendwas aber nicht ob deine Eingaben gleich sind!
 
Du meinst also eine Klasse, in welche ich Get und Set Methoden für jedes Merkmal (jede Eigenschaft) einfüge? Und diese dann hinter her mit der GUI verbinde...?
 
Ja genau.

Für die OOP versucht man reale Objekte in Klassen zu beschreiben. Willst du also 2 Personen vergleichen solltest du eben mal eine Klasse Person schreiben mit den von dir gewünschten Attributen (Eigenschaften). Dann kann man von dieser Klasse 2 Objekte erstellen und jeweils die Attribute setzen (set Methoden oder Konstruktor) und diese Klasse vergleichen. Zum Vergleichen muss man aber natürlich auch eine entsprechende Methode schreiben (eigene oder equals() überschreiben), damit man genau festlegt wann 2 Objekte die selben sind.
 
So, ich habe mir das jetzt noch einmal genauer angeschaut und versucht auf die folgende Weise zu lösen:
Java:
[code]
PartnerMatch pm=new PartnerMatch("");
		PartnerMatch2 pm2=new PartnerMatch2("");
		Person p1,p2;
		p1=new Person();
		p1.setName(pm.name1.getText());
		p1.setLand(pm.land1.getText());
		p1.setWohnort(pm.wohnort1.getText());
		p1.setBeruf(pm.beruf1.getText());
		p1.setGeburtsdatum(pm.geburtsdatum1.getText());
		p1.setHaarfarbe(pm.haarfarbe1.getText());
		p1.setAugenfarbe(pm.augenfarbe1.getText());
		p1.setGroesse(pm.groesse1.getText());
		
		p2=new Person();
		p2.setName(pm2.name1.getText());
		p2.setLand(pm2.land1.getText());
		p2.setWohnort(pm2.wohnort1.getText());
		p2.setBeruf(pm2.beruf1.getText());
		p2.setGeburtsdatum(pm2.geburtsdatum1.getText());
		p2.setHaarfarbe(pm2.haarfarbe1.getText());
		p2.setAugenfarbe(pm2.augenfarbe1.getText());
		p2.setGroesse(pm2.groesse1.getText());
[/code]

Java:
[code]
@Override
	public void actionPerformed(ActionEvent ae) 
	{
		//wenn ich dies hier nicht initialisiere wird einfach das ausgegeben, wie beschrieben, 
		PartnerMatch p1 =new PartnerMatch("");
		if(ae.getActionCommand().equals("Weiter"))
		{	//Die erste Angabe habe ich zum Testen einmal geändert. Dies änderte an der Ausgabe aber leider nichts... 
			String ausgabe="Partner 1"+"\n"+"Name: "+p1.name1.getText()+"\n"+"Land: "+land.getText()+"\n"+"Beruf: "+beruf.getText()+"\n"+"Wohnort: "+wohnort.getText()+"\n"+"Geburtsdatum: "+geburtsdatum.getText()+
					"\n"+"Haarfarbe: "+haarfarbe.getText()+"\n"+"Augenfarbe: "+augenfarbe.getText()+"\n"+"Groesse: "+groesse.getText();
			JOptionPane.showMessageDialog(null, ausgabe,"Ergebnis",JOptionPane.INFORMATION_MESSAGE);
			dispose();
		}
[/code]
Hier gibt es mir für das geänderte Feld aber nichts aus und bei den anderen wird bei der Ausgabe einfach das entsprechende Label gesetzt: z.B. "Beruf: Beruf:", "Land: Land:"

Hast du evtl. einen weiteren Tipp?
Lg
 
Der obere Code stammt aus dieser Klasse:

Java:
[code]
package partner_finden;

class PersonEingaben 
{
	public static void main(String args[])
	{
		PartnerMatch pm=new PartnerMatch("");
		PartnerMatch2 pm2=new PartnerMatch2("");
		Person p1,p2;
		p1=new Person();
		p1.setName(pm.name1.getText());
		p1.setLand(pm.land1.getText());
		p1.setWohnort(pm.wohnort1.getText());
		p1.setBeruf(pm.beruf1.getText());
		p1.setGeburtsdatum(pm.geburtsdatum1.getText());
		p1.setHaarfarbe(pm.haarfarbe1.getText());
		p1.setAugenfarbe(pm.augenfarbe1.getText());
		p1.setGroesse(pm.groesse1.getText());
		
		p2=new Person();
		p2.setName(pm2.name1.getText());
		p2.setLand(pm2.land1.getText());
		p2.setWohnort(pm2.wohnort1.getText());
		p2.setBeruf(pm2.beruf1.getText());
		p2.setGeburtsdatum(pm2.geburtsdatum1.getText());
		p2.setHaarfarbe(pm2.haarfarbe1.getText());
		p2.setAugenfarbe(pm2.augenfarbe1.getText());
		p2.setGroesse(pm2.groesse1.getText());
	}
}
[/code]

Der untere Code kommt aus dieser Klasse:

Java:
[code]
package partner_finden;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

public class PartnerMatch extends JFrame implements ActionListener
{
	private static final long serialVersionUID = 1L;
	JLabel name,land,beruf,wohnort,geburtsdatum,haarfarbe,augenfarbe,groesse,l9,l10;
	JTextField name1,land1,beruf1,wohnort1,geburtsdatum1,haarfarbe1,augenfarbe1,groesse1,tf9,tf10;
	JRadioButton maennlich,weiblich;
	JButton abbrechen,weiter,b3;
	Container c;
	
	public PartnerMatch(String titel)
	{
		c=getContentPane();
		setLayout(new GridLayout(10,2));
		setTitle("Partner finden V2");
		name=new JLabel("Name: ", JLabel.RIGHT);
		land=new JLabel("Land: ",JLabel.RIGHT);
		beruf=new JLabel("Beruf: ",JLabel.RIGHT);
		wohnort=new JLabel("Wohnort: ",JLabel.RIGHT);
		geburtsdatum=new JLabel("Geburtsdatum: ",JLabel.RIGHT);
		haarfarbe=new JLabel("Haarfarbe: ",JLabel.RIGHT);
		augenfarbe=new JLabel("Augenfarbe: ",JLabel.RIGHT);
		groesse=new JLabel("Groesse: ",JLabel.RIGHT);
		name1=new JTextField();
		land1=new JTextField();
		beruf1=new JTextField();
		wohnort1=new JTextField();
		geburtsdatum1=new JTextField();
		haarfarbe1=new JTextField();
		augenfarbe1=new JTextField();
		groesse1=new JTextField();
		maennlich=new JRadioButton("maennlich");
		weiblich=new JRadioButton("weiblich");
		abbrechen=new JButton("Abbrechen");
		weiter=new JButton("Weiter");
		abbrechen.addActionListener(this);
		weiter.addActionListener(this);
		c.add(maennlich);c.add(weiblich);c.add(name);c.add(name1);c.add(land);c.add(land1);c.add(beruf);c.add(beruf1);
		c.add(wohnort);c.add(wohnort1);c.add(geburtsdatum);c.add(geburtsdatum1);c.add(haarfarbe);c.add(haarfarbe1);c.add(augenfarbe);c.add(augenfarbe1);
		c.add(groesse);c.add(groesse1);c.add(abbrechen);c.add(weiter);
		abbrechen.setSelected(true);
		setSize(250, 500);
		setResizable(false);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) 
	{
		new PartnerMatch("Partner finden V2");
	}
	
	@Override
	public void actionPerformed(ActionEvent ae) 
	{
		//wenn ich dies hier nicht initialisiere wird einfach das ausgegeben, wie beschrieben, 
		PartnerMatch p1 =new PartnerMatch("");
		if(ae.getActionCommand().equals("Weiter"))
		{	//Die erste Angabe habe ich zum Testen einmal geändert. Dies änderte an der Ausgabe aber leider nichts... 
			String ausgabe="Partner 1"+"\n"+"Name: "+p1.name1.getText()+"\n"+"Land: "+land.getText()+"\n"+"Beruf: "+beruf.getText()+"\n"+"Wohnort: "+wohnort.getText()+"\n"+"Geburtsdatum: "+geburtsdatum.getText()+
					"\n"+"Haarfarbe: "+haarfarbe.getText()+"\n"+"Augenfarbe: "+augenfarbe.getText()+"\n"+"Groesse: "+groesse.getText();
			JOptionPane.showMessageDialog(null, ausgabe,"Ergebnis",JOptionPane.INFORMATION_MESSAGE);
			dispose();
		}
		
		new PartnerMatch2("Partner 2");
		//wie kann ich hier die Eingaben der beiden Klassen miteinander vergleichen
		//ohne die if abfrage funktioniert es. nur eben gibt es keine Ausgabe wie gewünscht
//		if(Partner_match.this.equals(Partner_match2.class))
//		{
//			JOptionPane.showMessageDialog(null,"Sie passen gut zusammen :-)","Ergebnis",JOptionPane.INFORMATION_MESSAGE);//String ausgabe="";
//		}
	}
}
[/code]

Ich hoffe, das reicht an Code. Ich habe noch eine zwei weitere Klassen, wobei eine davon PartnerMatch2 darstellt und ich am überlegen bin, diese zu entfernen.
Für Tipps wäre ich dir dankbar 🙂

Lg
 
Java:
	public static void main(String args[])
	{
		PartnerMatch pm=new PartnerMatch("");
		PartnerMatch2 pm2=new PartnerMatch2("");
		Person p1,p2;
		p1=new Person();
		p1.setName(pm.name1.getText());
		p1.setLand(pm.land1.getText());
.....
		
		p2=new Person();
		p2.setName(pm2.name1.getText());
		p2.setLand(pm2.land1.getText());
.....
	}

Du hast hier einen Denkfehler! Nur weil du 2 Fenster erzeugst bleibt der Code nicht stehen.
In diesem Fall werden deine beiden Fenster erzeugt, dann eine Person erstellt welche leere (empty) Daten aus den Fenster gesetzt bekommt. (analog dazu die zweite Person).

Vergiss vorerst das du die Daten per Fenster eingeben willst! Das hindert dich nur daran das Problem zu verstehen und lösen!
Setze den Objekten p1 und p2 fixe Werte im Code und baue den Vergleich ein. Wenn dieser Vergleich funktioniert kann man die GUI wieder dazugeben.
STEP BY STEP ist einfach der beste Weg um Probleme zu lösen! (gilt für Anfänger als auch für Profis)

Java:
	@Override
	public void actionPerformed(ActionEvent ae) 
	{
		//wenn ich dies hier nicht initialisiere wird einfach das ausgegeben, wie beschrieben, 
		PartnerMatch p1 =new PartnerMatch("");
		if(ae.getActionCommand().equals("Weiter"))
		{	//Die erste Angabe habe ich zum Testen einmal geändert. Dies änderte an der Ausgabe aber leider nichts... 
			String ausgabe="Partner 1"+"\n"+"Name: "+p1.name1.getText()+"\n"+"Land: "+land.getText()+"\n"+"Beruf: "+beruf.getText()+"\n"+"Wohnort: "+wohnort.getText()+"\n"+"Geburtsdatum: "+geburtsdatum.getText()+
					"\n"+"Haarfarbe: "+haarfarbe.getText()+"\n"+"Augenfarbe: "+augenfarbe.getText()+"\n"+"Groesse: "+groesse.getText();
			JOptionPane.showMessageDialog(null, ausgabe,"Ergebnis",JOptionPane.INFORMATION_MESSAGE);
			dispose();
		}
		
		new PartnerMatch2("Partner 2");
		//wie kann ich hier die Eingaben der beiden Klassen miteinander vergleichen
		//ohne die if abfrage funktioniert es. nur eben gibt es keine Ausgabe wie gewünscht
//		if(Partner_match.this.equals(Partner_match2.class))
//		{
//			JOptionPane.showMessageDialog(null,"Sie passen gut zusammen :-)","Ergebnis",JOptionPane.INFORMATION_MESSAGE);//String ausgabe="";
//		}
	}
}

Du hast noch Probleme mit den Grundlagen wie man hier sehen kann. Wenn du das Problem STEP BY STEP löst wirst du einerseits die Grundlagen festigen und andererseits das Problem lösen 😀
Du erzeugt in dieser Methode zwei Objekte die für die Lösung des Problems nicht gebraucht werden! In der actionPerformed Methode erzeuge aus den Inhalten der Textfields einfach ein Objekt der Klasse Person und speicher diese. Dann leere die Textfields, lasse neue Daten eingeben und erzeuge aus diesen ein weiteres Objekt der Klasse Person. Nun kannst du diese beiden Objekte miteinander vergleichen.
 
Zuletzt bearbeitet:
Ich habe die überflüssige Klasse jetzt entfernt. Wenn ich die Daten fix im Code einbette, klappt auch alles. Also der Vergleich und die Ausgabe. Jetzt weiß ich nur nicht wie ich das mit der grafischen Oberfläche verbinden soll bzw. wie ich die dort eingegebenen Daten übertragen soll.
Kannst du deinen letzten Abschnitt mit der actionPerformed Methode genauer erklären?
Also an sich verstehe ich was du meinst, nur nicht, wie ich das umsetzen kann bzw. soll.

Lg
 
Java:
@Override
public void actionPerformed(ActionEvent ae) 
{
    Person newPerson = new Person(.....);
    if(person == null) {
        // neues Fenster öffnen und person übergeben
        // dieses fenster schließen
    } else {
        // vergleichen und Ausgabe machen
}

Am einfachsten wäre einfach die erstellt aus den eingegeben Daten eine Objekt der Klasse Person. Dann entscheidest du ob das Attribut "person" gesetzt wurde oder nicht.
Wenn nicht öffne ein neues Fenster und übergib im Konstruktor deine soeben erstelltes Personenobjekt.
Wenn ja vergleiche die beiden objekte und mache deine ausgabe.

Da du nicht gesagt hast ob das ganze Teil eines größeren Projektes ist, kann man nichts genaueres sagen.
Aber ich finde dieses "mitschleifen" nicht schön.
 

Zurück
Oben