Werte von Kompon. einzelner Fenster übernehmen u. in neuem Fen. anzeigen

Hallo Leute,

ich habe wegen dieses Problems auch schon länger Google beschäftigt. Aber zu meinem Problem gibt es wohl noch keine Lösung.
Ich habe eine Klasse, welche ein Fenster erzeugt. In dieser Klasse wird ebenfalls ein Actionlistener implementiert. Hier erzeuge ich neue Fenster mit Eingabemöglichkeiten (die Klassen für die Fenster, habe ich über externe Libraries eingebunden).
Meine Frage ist jetzt, wie kann ich die Werte, die ich in die einzelnen Fenster eingebe auslesen und z.B. in einem neuen Fenster oder über ein JOptionPane anzeigen lassen. Die Klassen für die einzelnen Fenster liegen im Projektordner “Referenced Libraries”

Folgender Ansatz:

class ButtonListener implements ActionListener
        {
        	 Font schrift=new Font(Font.SANS_SERIF,Font.ITALIC, 12);
             Font schriftAlt=new Font(Font.SANS_SERIF,Font.BOLD,12);
             @Override
             public void actionPerformed(ActionEvent ae)
             {
             		Dimension d=Toolkit.getDefaultToolkit().getScreenSize().getSize();
                    if(ae.getActionCommand().equals("neues Fenster"))
                     {
                    	 int a=0,b=0;
                         Fenster2 f=new Fenster2();
                         f.setLocation(a=(int)(d.getSize().getWidth())-(int)(d.getSize().getWidth()),b=(int)(d.getSize().getHeight()/2)+200);
                     } 
                     else if(ae.getActionCommand().equals("Werte anzeigen"))
                     {
                    	 int a=0,b=0;
                         Fenster f2=new Fenster();
                         JLabel anzeige=new JLabel();
                         f2.setLocation(a=(int)(d.getSize().getWidth())-((int)d.getSize().getWidth())+350, (b=(int)d.getSize().getHeight())-240);
                         f2.add(anzeige);
                         //Ansatz
                         Skisprung ski=new Skisprung();
                         anzeige.setText(""+ski.ergebnisNormalschanze(normaleschanze, haltung));
                     }

Ich kann auch gerne noch weiteren Code anfügen. Das ist jetzt nur ein kleiner Ausschnitt der actionPerformed Methode.
Habt ihr hier Tipps oder Lösungen? Gehe ich komplett falsch vor?
Vielen Dank schon mal für eure Mühe.

Lg

Moin,

Was auch immer die Klasse “Fenster” ist … :twisted:
Hat sie denn keine Getter-und Setter-Methoden ??

Gruß
Klaus

Nein, hat sie nicht. Ich habe beim erstellen der Klasse nur mit dem Gedanken gespielt, ein Fenster mit “Inhalt” anzeigen zu lassen. Daher sieht die Klasse wie folgt aus:

class Fenster extends JFrame
        {
                private static final long serialVersionUID = 1L;
                JLabel anzeige;
                public Fenster()
                {
                        setSize(300, 300);
                        setLocation(400, 300);
                        add(anzeige=new JLabel("neues Fenster"));
                        setVisible(true);
                        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                }
        }

Und sie ist eine innere Klasse der Hauptanwendung.
Hast du hier einen Tipp? oder wie ich die vorhanden Klasse erweitern kann? Also unter oben genannter Voraussetzung.

Moin,

ja nun, bau Dir halt Getter und Setter ein …

Gruß
Klaus

Je nach Anwendung, lohnt es sich eine Art DTO(DataTransferObject) oder gar ein gemeinsames Modell(Stichwort MVC-Pattern) zu verwenden.

Ich habe das Programm jetzt etwas abgewandelt. Jetzt wird das letzte immer zuerst geschlosse und anschließend das neue aufgerufen, Die Werte werden gesondert angezeigt.
Jedoch habe ich jetzt ein anderes Problem. Manche Fenster bleiben trotz des Befehls dispose geöffnet und es öffnet sich nach einer Auswahl das neue Fenster darüber. Soweit ich das bisher gesehen habe, stehen die dispose Befehle überall dort bevor etwas neues beginnt. Kann mir hier jemand sagen wo der Fehler ist und was ich ändern muss?

Hie der gesamte Code:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
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.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class VerschiedeneListenerAlsMenu extends JFrame
{
	private static final long serialVersionUID = 1L;
	JMenuBar mb=new JMenuBar();
	JMenu menue;
	JLabel anz;
	JMenuItem neuesFenster,rechner,geschwindigkeit,sprung,groesser,kleiner,ursprung,neuePos,anderePos,
    altePos,neuSchrift,alteSchrift,paint,werte;
	JPanel lage;
	JButton anfang;
	
	ToolbarListener tl=new ToolbarListener();
	
	public VerschiedeneListenerAlsMenu(String titel)
	{
		
	}
	
	public VerschiedeneListenerAlsMenu()
	{
		setSize(600, 600);
		setLayout(new BorderLayout());
		add(mb=new JMenuBar(),BorderLayout.NORTH);
		mb.add(menue=new JMenu("Start"));
		menue.add(neuesFenster=new JMenuItem("neues Fenster"));
		neuesFenster.addActionListener(tl);
		neuesFenster.setActionCommand("neues Fenster");
		
		menue.add(rechner=new JMenuItem("Rechner"));
		rechner.setActionCommand("Rechner");
		rechner.addActionListener(tl);
		
		menue.add(geschwindigkeit=new JMenuItem("Geschwindigkeitswandler"));
		geschwindigkeit.setActionCommand("Geschwindigkeitswandler");
		geschwindigkeit.addActionListener(tl);
		
		menue.add(sprung=new JMenuItem("Skisprung"));
		sprung.setActionCommand("Skisprung");
		sprung.addActionListener(tl);
		
		menue.add(groesser=new JMenuItem("Groesser"));
		groesser.setActionCommand("Groesser");
		groesser.addActionListener(tl);
		
		menue.add(kleiner=new JMenuItem("Kleiner"));
		kleiner.setActionCommand("Kleiner");
		kleiner.addActionListener(tl);
		
		menue.add(ursprung=new JMenuItem("Ursprungsgroesse"));
		ursprung.setActionCommand("Ursprungsgroesse");
		ursprung.addActionListener(tl);
		
		menue.add(neuePos=new JMenuItem("neue Position"));
		neuePos.setActionCommand("neue Position");
		neuePos.addActionListener(tl);
		
		menue.add(anderePos=new JMenuItem("andere Position"));
		anderePos.setActionCommand("andere Position");
		anderePos.addActionListener(tl);
		
		menue.add(altePos=new JMenuItem("alte Position"));
		altePos.setActionCommand("alte Position");
		altePos.addActionListener(tl);
		
		menue.add(neuSchrift=new JMenuItem("neue Schrift"));
		neuSchrift.addActionListener(tl);
		
		menue.add(alteSchrift=new JMenuItem("alte Schrift"));
		alteSchrift.addActionListener(tl);
		
		menue.add(paint=new JMenuItem("Zeichnen"));
		paint.setActionCommand("Zeichnen");
		paint.addActionListener(tl);
		
		menue.add(werte=new JMenuItem("Werte"));
		werte.setActionCommand("Werte");
		werte.addActionListener(tl);
		
		add(anfang=new JButton("zum Anfang"),BorderLayout.SOUTH);
		anfang.addActionListener(tl);
		anfang.setActionCommand("Anfang");
		Dimension d=Toolkit.getDefaultToolkit().getScreenSize().getSize();
		int b;
		setLocation(500,b=(int)d.getSize().getHeight()-600);
		setVisible(true);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}
	//Wird aufgerufen wenn die Starteinstellungen geladen werden sollen
	public void letzteEinstellung()
	{
		Rechner re=new Rechner("");
		VerschiedeneListenerAlsMenu vlam2=new VerschiedeneListenerAlsMenu();
		vlam2.add(lage=new JPanel(),BorderLayout.CENTER);
		lage.add(re);
		vlam2.setVisible(true);
	}
	
	public void rechner(JButton plus, JButton minus, JButton mal, JButton geteilt, JButton q, JButton w, JButton p, JButton loeschen, JLabel op1, JLabel op2, JLabel erg, JLabel anz2, JTextField eing1, JTextField eing2)
	{
		dispose();
		Rechner re=new Rechner("");
		ToolbarListener tl=new ToolbarListener();
		RechnerListener rl=new RechnerListener();
		re.setSize(750, 200);
		re.setLayout(new BorderLayout());
		re.setLayout(new GridLayout(3, 4));
		re.setLocationRelativeTo(null);
		re.remove(anfang);
		re.add(mb);
		re.add(eing1=new JTextField(10));
		re.add(eing2=new JTextField(10));
		plus.addActionListener(tl);
		minus.addActionListener(tl);
		mal.addActionListener(tl);
		geteilt.addActionListener(tl);
		re.add(geteilt);
		q.setToolTipText("Berechnet die Quersumme beider Operanden bis zu der Eingabe von 99");
		q.addActionListener(tl);
		w.setToolTipText("Berechnet die Wurzel der Addition beider Operanden");
		w.addActionListener(tl);
		p.setToolTipText("Berechnet die Potenz des ersten Operators mit der Angabe des zweiten Operators");
		p.addActionListener(tl);
		loeschen.addActionListener(tl);
		re.setVisible(true);
		re.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}
	
	
	class RechnerListener implements ActionListener
	{

		@Override
		public void actionPerformed(ActionEvent ae) 
		{
			double zahl1=Double.parseDouble(rechner.getText()),zahl2=Double.parseDouble(rechner.getText());
			if(ae.getActionCommand().equals("+"))
			{
				double ergebnis=zahl1+zahl2;
				anz.setText(""+ergebnis);
			}
			else if(ae.getActionCommand().equals("-"))
			{
				double ergebnis=zahl1-zahl2;
				anz.setText(""+ergebnis);
			}
			else if(ae.getActionCommand().equals("*"))
			{
				double ergebnis=zahl1*zahl2;
				anz.setText(""+ergebnis);
			}
			else if(ae.getActionCommand().equals("/"))
			{
				double ergebnis=zahl1/zahl2;
				anz.setText(""+ergebnis);
			}
			else if(ae.getActionCommand().equals("Q"))
			{
				double Quersumme=(((zahl1)/10)+((zahl1)%10))+(((zahl2)/10)+((zahl2)%10));
				anz.setText(""+Quersumme);
			}
			else if(ae.getActionCommand().equals("W"))
			{
				double W=Math.sqrt(Math.round(zahl1)+Math.round(zahl2));
				anz.setText(""+W);
			}
			else if(ae.getActionCommand().equals("P"))
			{
				anz.setText(""+Math.pow(zahl1, zahl2));
			}
		}
		
	}
	
	class ToolbarListener implements ActionListener
	{
		Dimension d=Toolkit.getDefaultToolkit().getScreenSize().getSize();
		@Override
		public void actionPerformed(ActionEvent ae) 
		{
			//Wenn im Menü dieser Eintrag ausgewählt wird, soll folgendes passieren
			if(ae.getActionCommand().equals("neues Fenster"))
			{
				JLabel anzeige;
				VerschiedeneListenerAlsMenu vlam=new VerschiedeneListenerAlsMenu("neues Fenster");
				int a=0,b=0;
				vlam.setSize(200, 200);
				vlam.setLocation(a=(int)d.getSize().getWidth()/2,b=(int)d.getSize().getHeight()/2);
				vlam.add(anzeige=new JLabel("neues Fenster"));
				vlam.setVisible(true);
				vlam.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			}
			else if(ae.getActionCommand().equals("Rechner"))
			{
				JButton plus,minus,mal,geteilt,q,w,p,loeschen;JLabel op1,op2,erg,anz;JTextField eing1,eing2;
				rechner(plus=null,minus=null,mal=null,geteilt=null,q=null,w=null,p=null,loeschen=null,op1=null,op2=null,erg=null,anz=null,eing1=null,eing2=null);
			}
			else if(ae.getActionCommand().equals("Geschwindigkeitswandler"))
			{
				dispose();
				Geschwindigkeit_grafisch geschw=new Geschwindigkeit_grafisch("");
				geschw.add(mb);
				geschw.setLocationRelativeTo(null);
				geschw.setVisible(true);
				geschw.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			}
			else if(ae.getActionCommand().equals("Skisprung"))
			{
				dispose();
				Skisprung ski=new Skisprung();
				ski.add(mb);
				ski.setVisible(true);
				ski.setLocationRelativeTo(null);
				ski.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			}
			else if(ae.getActionCommand().equals("Groesser"))
			{
				dispose();
				int a,b;
				setSize(a=(int)d.getSize().getWidth(),b=(int)d.getSize().getHeight());
				setLocation(0,0);
				setLayout(new BorderLayout());
				add(mb,BorderLayout.NORTH);
				setVisible(true);
				setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			}
			else if(ae.getActionCommand().equals("Kleiner"))
			{
				dispose();
				int a,b;
				setSize(a=(int)d.getSize().getWidth()/4,b=(int)d.getSize().getHeight()/4);
				setLocation(a=(int)d.getSize().getWidth()/2,b=(int)d.getSize().getHeight()/2);
				setLayout(new BorderLayout());
				add(mb,BorderLayout.NORTH);
				setVisible(true);
				setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			}
			else if(ae.getActionCommand().equals("Ursprungsgroesse"))
			{
				dispose();
				setSize(600,600);
				setVisible(true);
				setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			}
			else if(ae.getActionCommand().equals("neue Position"))
			{
				dispose();
				setLocation(0, 0);
				setVisible(true);
				setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			}
			else if(ae.getActionCommand().equals("andere Position"))
			{
				dispose();
				int a,b;
				setLocation(a=(int)d.getSize().getWidth()-200,b=(int)d.getSize().getHeight()-500);
				setVisible(true);
				setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			}
			else if(ae.getActionCommand().equals("alte Position"))
			{
				dispose();
				int b;
				setLocation(500,b=(int)d.getSize().getHeight()-600);
				setVisible(true);
				setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			}
			else if(ae.getActionCommand().equals("Anfang"))
			{
				dispose();
				letzteEinstellung();
			}
		}
	}

	public static void main(String args[])
	{
		new VerschiedeneListenerAlsMenu();
	}
}

die referenced Libraries habe ich natürlich nicht gepostet…
Für einen Tipp wäre ich euch dankbar.

Lg

Es macht keinen Sinn immer wieder neue Fenster zu öffnen. Ein JFrame ist nicht die Applikation, sondern nur ein Hilfsmittel um etwas auf dem Bildschirm anzuzeigen.
Verwende ein Fenster tausche bei Bedarf die Inhalte aus, z.B. mittels CardLayout, JTabbedPane o.ä.
Erzeuge Objekte, UI Elemente die Du immer wieder benötigst nicht ständig neu. Erstelle sie einmalig und verwende sie wieder. Du kaufst Dir doch auch nicht jedes Mal einen neuen Taschenrechner, wenn Du mal wieder etwas berechnen willst.

@TO
Du postest hier 300 Zeilen Code. Das allein ist auch für die Zukunft schon ein Zeichen, dass hier was nich ganz richtig läuft.
Du hast ein Problem, bei dem man dir helfen soll. Dann poste bitte ein KSKB wobei das erste “K” für “kurz” steht.
In deinem fall ein Fenster mit einem Knopf, einem Textfeld und der Funktionalität des Öffnens und Schließens der Fenster, wie du´s gern hättest.(max 50Zeilen, mehr brauchts nich)

Ja, ok es ist zusätzlicher Aufwand, aber erstens für dich (ist ja auch dein Problem) und zweitens löst sich das Problem häufig beim nachstellen von selbst.
300 Zeilen Code zieh ich mir nur zum Spaß jedenfalls nicht rein und kann dir dann auch nicht helfen.

@Rest,
ja die Leier ist alt aber musste ma wieder raus, scnr

Gruß Vanny

Kein Thema, ich probiers halt noch mal anders.