Werte austauschen/übergeben

fix

Mitglied
Hallo Leute,

ich habe 2 Frames, von dem ersten Frame wird per Button ein zweites Frame geöffnet. Anschließend soll von dem zweiten Frame ein berechneter Wert an das erste Frame zum weiterrechnen übergeben werden.
Soweit sogut, um den Wert zu übergeben muss ich doch von der zweiten Klasse den Wert mittels extends an die erste übergeben oder habe ich das falsch verstanden?

Irgendwie bekomme ich das mit der Vererbung nicht hin.

Mein aktueller Lösungsansatz:


Hauptfenster.java
Java:
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class Hauptfenster extends JFrame {

	private JPanel contentPane;
	private JTextField texthoehe;
	private JTextField textflaeche;
	private JTextField textvolumen;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Hauptfenster frame = new Hauptfenster();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Hauptfenster() {
		setTitle("Volumen");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblHoehe = new JLabel("Hoehe");
		lblHoehe.setBounds(91, 14, 36, 14);
		contentPane.add(lblHoehe);
		
		texthoehe = new JTextField();
		texthoehe.setBounds(149, 11, 86, 20);
		contentPane.add(texthoehe);
		texthoehe.setColumns(10);
		
		JButton btnNeuesFenster = new JButton("Flaechenberechnung");
		btnNeuesFenster.setBounds(245, 35, 156, 23);
		btnNeuesFenster.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				new Flaeche().setVisible(true);
			}
		});
		contentPane.add(btnNeuesFenster);
		
		JLabel lblFlaeche = new JLabel("Flaeche");
		lblFlaeche.setBounds(91, 39, 46, 14);
		contentPane.add(lblFlaeche);
		
		textflaeche = new JTextField();
		textflaeche.setEditable(false);
		textflaeche.setBounds(149, 36, 86, 20);
		contentPane.add(textflaeche);
		textflaeche.setColumns(10);
		
		JLabel lblErgebnis = new JLabel("Volumen");
		lblErgebnis.setBounds(91, 90, 58, 14);
		contentPane.add(lblErgebnis);
		
		textvolumen = new JTextField();
		textvolumen.setBounds(149, 87, 86, 20);
		contentPane.add(textvolumen);
		textvolumen.setColumns(10);
		
		JButton btnBerechnen = new JButton("Berechnen");
		btnBerechnen.setBounds(245, 86, 156, 23);
		contentPane.add(btnBerechnen);
	}
}

Flaeche.java
Java:
import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class Flaeche extends JFrame {

	private JPanel contentPane;
	private JTextField txtlaenge;
	private JTextField txtbreite;
	private JTextField txterg;
	private String uebergabe;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Flaeche frame = new Flaeche();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Flaeche() {
		setTitle("Fl\u00E4chenberechnung Rechteck");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblLaenge = new JLabel("Laenge");
		lblLaenge.setBounds(23, 32, 46, 14);
		contentPane.add(lblLaenge);
		
		txtlaenge = new JTextField();
		txtlaenge.setBounds(91, 29, 86, 20);
		contentPane.add(txtlaenge);
		txtlaenge.setColumns(10);
		
		JLabel lblBreite = new JLabel("Breite");
		lblBreite.setBounds(23, 57, 46, 14);
		contentPane.add(lblBreite);
		
		txtbreite = new JTextField();
		txtbreite.setBounds(91, 54, 86, 20);
		contentPane.add(txtbreite);
		txtbreite.setColumns(10);
		
		JLabel lblErgebnis = new JLabel("Ergebnis");
		lblErgebnis.setBounds(23, 82, 55, 14);
		contentPane.add(lblErgebnis);
		
		txterg = new JTextField();
		txterg.setEditable(false);
		txterg.setBounds(91, 79, 86, 20);
		contentPane.add(txterg);
		txterg.setColumns(10);
		
		JButton btnBerechnen = new JButton("Berechnen");
		btnBerechnen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				try {
					
					///Umwandeln Komma zu Punkt
			
					String laenge = txtlaenge.getText();
					laenge = laenge.replace(',', '.');
					double dblaenge = Double.parseDouble(laenge);
				
					String breite = txtbreite.getText();
					breite = breite.replace(',', '.');
					double dbbreite = Double.parseDouble(breite);
						
					/// Berechnung der Werte
					
					String Ergebnis = String.format("%.2f", (dbbreite * dblaenge));
					txterg.setText(Ergebnis);
			
					}
				catch (NumberFormatException ex) {
				
				}
			}
		});
		btnBerechnen.setBounds(10, 107, 167, 23);
		contentPane.add(btnBerechnen);
		
		JButton btnUebernehmen = new JButton("Uebernehmen");
		btnUebernehmen.addActionListener((ActionListener) new Uebergabe());
		/*btnUebernehmen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				
			}
		});  */
		btnUebernehmen.setBounds(10, 141, 167, 23);
		contentPane.add(btnUebernehmen);
	}



public class Uebergabe extends Hauptfenster{
	
	@Override
     public void actionPerformed(ActionEvent ae) {
		        
		setVisible(false);
		System.out.println("läuft");

         
     }
     }
}
 
Zuletzt bearbeitet von einem Moderator:
also wenn ich dein Problem richtig versteh, hat das gar nix mit Vererbung zu tun o0.
[edit SlaterB: Titel inzwischen geändert]

Du hast 2 Objekte und willst zwischen denen "Werte" austauschen ....dafür gibts doch getter/setter bzw. Methoden mit Parametern 🙂

Vererbung ist z.b. wenn du eine Klasse Person hast und dann Untergruppen wie z.b. Arbeitnehmer und Arbeitgeber machen willst, die dann von der Person erben und so die "Eigenschaften" übernehmen/ spezialisiert werden können

p.s.:
Java:
catch (NumberFormatException ex) {
                
                }

sowas nicht machen,... mindestens ein "ex.printStackTrace();"
 
Zuletzt bearbeitet von einem Moderator:
Verrückt ... genau so ist es. Eigentlich will ich nur die Werte austauschen/übergeben aber ich habe bei mehreren Tutorials entnommen, dass es "Vererbung" genannt wurde.
 
Das Stichwort in deinem Fall ist eher die Referenzierung.

Bsp.:
Java:
public class DieAufrufendeKlasse {
	
	public DieAufrufendeKlasse(){
		
		new DieKlasseDieAnDieReferenzZurueckGibt(this);
		
	}

	public void say(String text){
		System.out.println(text);
	}
	
	public static void main(String[] args) {
		new DieAufrufendeKlasse();	
	}

}
und:
Java:
public class DieKlasseDieAnDieReferenzZurueckGibt {
	
	public DieKlasseDieAnDieReferenzZurueckGibt(DieAufrufendeKlasse referenz){
		referenz.say("Schalala");
	}

}
 
Zuletzt bearbeitet von einem Moderator:
Okay, ich habs mal versucht mit getter/setter.

Flache.java
Code:
public class Flaeche extends JFrame {

	private JPanel contentPane;
	private JTextField txtlaenge;
	private JTextField txtbreite;
	private JTextField txterg;
	private String ErgebnisFB;
	
	
	public String getErgebnisFB() {
		return ErgebnisFB;
	}

	public void setErgebnisFB(String ergebnisFB) {
		ErgebnisFB = ergebnisFB;
	}

Der errechnete Wert wird beim Button Uebernehmen auch richtig ausgegeben.

Code:
		JButton btnUebernehmen = new JButton("Uebernehmen");
		btnUebernehmen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.out.println(ErgebnisFB);

				
			}

Aber wenn ich den Wert in der anderen Klasse

Hauptfenster.java
Code:
JButton btnBerechnen = new JButton("Berechnen");
		btnBerechnen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.out.println(ergebnisFB);
			}
		});

angezeigt bzw. ins entsprechende Textfeld eingesetzt haben möchte, bekomm ich den Code nicht mehr ausgeführt.
 
Sorry, hatte mich auf den geposteten Code oben bezogen:

Hauptfenster.java
Code:
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class Hauptfenster extends JFrame {

	private JPanel contentPane;
	private JTextField texthoehe;
	private JTextField textflaeche;
	private JTextField textvolumen;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Hauptfenster frame = new Hauptfenster();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Hauptfenster() {
		setTitle("Volumen");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblHoehe = new JLabel("Hoehe");
		lblHoehe.setBounds(91, 14, 36, 14);
		contentPane.add(lblHoehe);
		
		texthoehe = new JTextField();
		texthoehe.setBounds(149, 11, 86, 20);
		contentPane.add(texthoehe);
		texthoehe.setColumns(10);
		
		JButton btnNeuesFenster = new JButton("Flaechenberechnung");
		btnNeuesFenster.setBounds(245, 35, 156, 23);
		btnNeuesFenster.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				new Flaeche().setVisible(true);
			}
		});
		contentPane.add(btnNeuesFenster);
		
		JLabel lblFlaeche = new JLabel("Flaeche");
		lblFlaeche.setBounds(91, 39, 46, 14);
		contentPane.add(lblFlaeche);
		
		textflaeche = new JTextField();
		textflaeche.setEditable(false);
		textflaeche.setBounds(149, 36, 86, 20);
		contentPane.add(textflaeche);
		textflaeche.setColumns(10);
		
		JLabel Ergebnis = new JLabel("Volumen");
		Ergebnis.setBounds(91, 90, 58, 14);
		contentPane.add(Ergebnis);
		
		textvolumen = new JTextField();
		textvolumen.setBounds(149, 87, 86, 20);
		contentPane.add(textvolumen);
		textvolumen.setColumns(10);
		
		JButton btnBerechnen = new JButton("Berechnen");
		btnBerechnen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.out.println(ergebnisFB);
			}
		});
		btnBerechnen.setBounds(245, 86, 156, 23);
		contentPane.add(btnBerechnen);
	}
	
	 public void say(String ergebnisFB){
	        System.out.println(ergebnisFB);
	    }
}

Flaeche.java
Code:
import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class Flaeche extends JFrame {

	private JPanel contentPane;
	private JTextField txtlaenge;
	private JTextField txtbreite;
	private JTextField txterg;
	private String ErgebnisFB;
	
	
	public String getErgebnisFB() {
		return ErgebnisFB;
	}

	public void setErgebnisFB(String ergebnisFB) {
		ErgebnisFB = ergebnisFB;
	}
	

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Flaeche frame = new Flaeche();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Flaeche() {
		setTitle("Fl\u00E4chenberechnung Rechteck");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		
		JLabel lblLaenge = new JLabel("Laenge");
		lblLaenge.setBounds(23, 32, 46, 14);
		contentPane.add(lblLaenge);
		
		txtlaenge = new JTextField();
		txtlaenge.setBounds(91, 29, 86, 20);
		contentPane.add(txtlaenge);
		txtlaenge.setColumns(10);
		
		JLabel lblBreite = new JLabel("Breite");
		lblBreite.setBounds(23, 57, 46, 14);
		contentPane.add(lblBreite);
		
		txtbreite = new JTextField();
		txtbreite.setBounds(91, 54, 86, 20);
		contentPane.add(txtbreite);
		txtbreite.setColumns(10);
		
		JLabel lblErgebnis = new JLabel("Ergebnis");
		lblErgebnis.setBounds(23, 82, 55, 14);
		contentPane.add(lblErgebnis);
		
		txterg = new JTextField();
		txterg.setEditable(false);
		txterg.setBounds(91, 79, 86, 20);
		contentPane.add(txterg);
		txterg.setColumns(10);
		
		JButton btnBerechnen = new JButton("Berechnen");
		btnBerechnen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				try {
					
					///Umwandeln Komma zu Punkt
			
					String laenge = txtlaenge.getText();
					laenge = laenge.replace(',', '.');
					double dblaenge = Double.parseDouble(laenge);
				
					String breite = txtbreite.getText();
					breite = breite.replace(',', '.');
					double dbbreite = Double.parseDouble(breite);
						
					/// Berechnung der Werte
					
					ErgebnisFB = String.format("%.2f", (dbbreite * dblaenge));
					txterg.setText(ErgebnisFB);
					
					}
				
				catch (NumberFormatException ex) {
					ex.printStackTrace();
				}
			}
		});
		btnBerechnen.setBounds(10, 107, 167, 23);
		contentPane.add(btnBerechnen);
		
		JButton btnUebernehmen = new JButton("Uebernehmen");
		btnUebernehmen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.out.println(ErgebnisFB);

				
			}
		}); 
		btnUebernehmen.setBounds(10, 141, 167, 23);
		contentPane.add(btnUebernehmen);
	}
}
 
> bekomm ich den Code nicht mehr ausgeführt.

das ist reichlich ungebau, aber anderes verrät immerhin einiges,

wenn es in der Klasse Flaeche ein Attribut ErgebnisFB gibt (besser klein schreiben!), dann kann man natürlich überall in der Klasse darauf zugreifen, auch in einem ActionListener für btnUebernehmen

warum sollte das für Hauptfenster gelten? zumal du dort nun ergebnisFB statt ErgebnisFB schreibst?
gibt es dort ein entsprechendes Attribut? doch wohl eher nicht, warum sollte ergebnisFB einfach so gehen?
das widerspricht doch allem oder etwartest du auch einfachen Zugriff auf andere Attribute von Flaeche, txtlaenge usw?

man muss doch ein paar Grundlagen beachten (Monate bevor je eine komplizierte GUI in Frage kommt!),
z.B. dass Attribute anderer Klassen nicht direkt vorhanden sind.., stell dir vor es gäbe mehrere Flaeche-Objekte, von welchem
sollte das Attribut ausgegeben werden, falls unterschiedliche Werte?

in Hauptfenster brauchst du eine Referenz auf eine Flaeche-Objekt, daran kannst du dann getErgebnisFB() aufrufen,
anscheinend sind beide Klassen ziemlich unabhängig, wie werden sie denn gestartet, als separate Programme?
zwischen zwei Programmen wäre die Übergabe ja noch 100fach schwieriger als zwischen zwei Objekten in einem Programm..
 
warum sollte das für Hauptfenster gelten? zumal du dort nun ergebnisFB statt ErgebnisFB schreibst?

Wenn ich mich richtig erinnere, habe ich gelesen, dass durch den Einsatz getter/setter die Möglichkeit geboten wird, dass extern drauf zugreifen kann.

oder etwartest du auch einfachen Zugriff auf andere Attribute von Flaeche, txtlaenge usw?

Nein

stell dir vor es gäbe mehrere Flaeche-Objekte, von welchem sollte das Attribut ausgegeben werden, falls unterschiedliche Werte?

Das war mir auch noch nicht klar, ich dachte, dass wäre dann eine spätere Frage.

wie werden sie denn gestartet, als separate Programme?

Nein, ich dachte, wenn man das Programm startet, dann öffnet sich nur das "Hauptfenster". Dort kann man dann verschiedene Werte für die Berechnung eingeben. Wenn man z.B. nicht weiß, wie man die Fläche von einer Form ausrechnet, dann kann man auf einen Button drücken und dort kommt ein neues Fenster (als Hilfe), wo man die nötigen Eingaben für die Flächenbrechnung macht. Anschließend soll das ganze dann an das Ursprüngliche Hauptfenster zurück übergeben werden und zum Schluß als Volumen errechnet werden.
 
> new Flaeche().setVisible(true);

jetzt sehe ich es, dieses Flaeche-Objekt könntest du in einem Attribut speichern und dann wie gesagt
> flaeche.getErgebnisFB();
anderswo in der Klasse mit dem Attribut flaeche

geht natürlich nur wenn das Objekt auch da ist, zeitliche Reihenfolge beachten, evtl. null-Wert prüfen usw.


du kannst übrigens JAVA statt CODE-Tags verwenden, bei 44 Postings lohnt sich langsam, das zu lernen
 
Ich hab mir mal kurz die Mühe gemacht dir was zusammenzuschreiben (in der Arbeit gerade nix los 😉)

Java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;


public class Window1 {

	private JLabel label1, label2;
	private Window2 window2;

	public void setLabelText(String text) {
		label1.setText(text);
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				new Window1();
			}
		});
	}
	
	public Window1() {
		JFrame frame = new JFrame("Window1");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel mainPanel = new JPanel(new GridLayout(2, 2));
		
		label1 = new JLabel("unchanged");
		JButton button = new JButton("Open Window2");
		button.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				window2 = new Window2(Window1.this);
			}
		});
		
		mainPanel.add(label1);
		mainPanel.add(button);
		
		label2 = new JLabel();
		JButton getButton = new JButton("Get text");
		getButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				if(window2 != null) {
					label2.setText(window2.getText());
				}
			}
		});
		
		mainPanel.add(label2);
		mainPanel.add(getButton);
		
		frame.setContentPane(mainPanel);
		frame.pack();
		frame.setVisible(true);
	}

}

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;



public class Window2 {
	
	
	private Window1 window1;
	private JTextField field;

	public Window2(Window1 window1) {
		this();
		this.window1 = window1;
	}

	private Window2() {
		JFrame frame = new JFrame("Window 2");
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		
		JPanel mainPanel = new JPanel();
		
		field = new JTextField(10);
		JButton button = new JButton("Commit");
		button.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				window1.setLabelText(field.getText());				
			}
		});
		
		mainPanel.add(field);
		mainPanel.add(button);
		
		frame.setContentPane(mainPanel);
		frame.pack();
		frame.setVisible(true);
	}
	
	public String getText() {
		return field.getText();
	}
	
}
 

Zurück
Oben