Variablen an anderes Fenster übergeben

Ossiost

Grünschnabel
Hallo,
ich habe ein Problem mit meinem Programm. Ich habe auch schon gegooglet aber bin mit den Erklärungen trotzdem leider nicht weiter gekommen.
Ich habe ein Fenster, welches bei Programmstart geöffnet wird und der Benutzer eine Eingabe machen kann. Diese Eingabe soll jetzt in eine int Variable gespeichert werden und diese möchte ich dann im nächsten Fenster wieder verwenden und zwar mit dem Wert, den der Benutzer eingegeben hat.

Quelltext 1.Fenster:
Code:
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.BoxLayout;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.font.*;
import java.awt.*;
import java.awt.event.*;

public class Fenster1 extends JFrame 
{
	
	
	private static final long serialVersionUID = 1L;
	private JPanel pWillkommen;
	private JPanel pMessdaten;
	private JPanel pMessungen;
	private JPanel pButton;
	private JLabel Willkommen;
	private JLabel Messdaten;
	private JLabel Messungen;
	private JTextField nMessdaten;
	private JTextField nMessungen;
	private JButton Weiter;
	
	int AnzMessdaten = 0;
	int AnzMessungen = 0;
	
	public Fenster1 ()
	{
		super("Fenster 1");
		setSize(500,300);
		setVisible(true);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
		
		pWillkommen = new JPanel();
		pMessdaten = new JPanel();
		pMessungen = new JPanel();
		pButton = new JPanel();
		Willkommen = new JLabel("Willkommen bei LabTable");
		Messdaten = new JLabel("Wie viele Messdaten (z.B. Temperatur, Zeit...) möchten Sie aufnehmen?");
		Messungen = new JLabel("Wie viele Messungen möchten Sie durchführen?");
		Weiter = new JButton("Weiter");
		nMessdaten = new JTextField(2);
		nMessdaten.setHorizontalAlignment(nMessdaten.RIGHT);
		nMessungen = new JTextField(2);
		nMessungen.setHorizontalAlignment(nMessungen.RIGHT);
		
		Font Ueberschrift = (Willkommen.getFont().deriveFont(Font.BOLD, 20));
		Willkommen.setFont(Ueberschrift);
		
		pWillkommen.add(Willkommen);
		pMessdaten.add(Messdaten);
		pMessdaten.add(nMessdaten);
		pMessungen.add(Messungen);
		pMessungen.add(nMessungen);
		pButton.add(Weiter);
		add(pWillkommen);
		add(pMessdaten);
		add(pMessungen);
		add(pButton);
		
		Weiter.addActionListener(new WeiterButton ());
		
	}
	
	public class WeiterButton implements ActionListener {
		
		
		public void actionPerformed(ActionEvent e) {
			
			String varMessdaten = nMessdaten.getText();
			String varMessungen = nMessungen.getText();
			
				try {
					
					Integer.parseInt(varMessdaten);
					Integer.parseInt(varMessungen);
					
				}
				catch(Exception ex) {
				
					JOptionPane.showMessageDialog(null,"Bitte geben Sie jeweils eine ganze Zahl ein, die größer als 0 ist!");
					
				}					
			
			AnzMessdaten = Integer.parseInt(varMessdaten);	
			AnzMessungen = Integer.parseInt(varMessungen);
			
			if(AnzMessdaten<1 | AnzMessungen<1 ) {
				
				JOptionPane.showMessageDialog(null,"Bitte geben Sie jeweils eine ganze Zahl ein, die größer als 0 ist!");
				
			}
			else {
				System.out.println("klappt!");
				close();
				Fenster2 window2 = new Fenster2 ();
				window2.setVisible(true);
			}
			
		}


	
		
	}

	public void close() {
		
		WindowEvent winClosingEvent = new WindowEvent(this,WindowEvent.WINDOW_CLOSING);
		Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(winClosingEvent);
		
	}

Quelltext 2.Fenster:
Code:
import java.awt.Component;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JButton;



public class Fenster2 extends JFrame 
{

	private JLabel Frage1;
	private JButton Weiter2;
	private JLabel lSumme;
	private JLabel lMittelwert;
	private JLabel lStandardabweichung;
	int a = 0;
	int b = 0;
	int c = 0;
	int Reihen = 0;
	
	public Fenster2 ()
	{
		super("Fenster 2");
		int x = 5; //Übergangsvariable
		setSize(500,25*x+175);
		setVisible(true);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setLayout(null);
		
		
		List<JComboBox> comboBoxList = new ArrayList<JComboBox>();
		List<JCheckBox> checkBoxListSum = new ArrayList<JCheckBox>();
		List<JCheckBox> checkBoxListMit = new ArrayList<JCheckBox>();
		List<JCheckBox> checkBoxListSta = new ArrayList<JCheckBox>();
		
		String[] Messdaten = {"", "Druck", "Masse", "Spannung", "Stromstärke", "Temperatur", "Volumen", "Zeit"};
		
		JPanel spalte0 = new JPanel();
		spalte0.setLayout(null);
		spalte0.setBounds(50, 50, 200, 300);
		JPanel spalte1 = new JPanel();
		spalte1.setLayout(null);
		spalte1.setBounds(300, 50, 50, 300);
		JPanel spalte2 = new JPanel();
		spalte2.setLayout(null);
		spalte2.setBounds(350, 50, 50, 300);
		JPanel spalte3 = new JPanel();
		spalte3.setLayout(null);
		spalte3.setBounds(400, 50, 50, 300);
		
		Frage1 = new JLabel ("Welche Daten möchten Sie messen?");
		Frage1.setBounds(20, 10, 460, 25);
		lSumme = new JLabel ("\u2211");
		lSumme.setBounds(5, 0, 25, 25);
		lSumme.setToolTipText("Summe");
		lMittelwert = new JLabel ("\u2205");
		lMittelwert.setBounds(5, 0, 25, 25);
		lMittelwert.setToolTipText("Mittelwert");
		lStandardabweichung = new JLabel ("\u03C3");
		lStandardabweichung.setBounds(5, 0, 25, 25);
		lStandardabweichung.setToolTipText("Standardabweichung");
		Weiter2 = new JButton ("Weiter");
		Weiter2.setBounds(20, 25*(x-1)+125, 150, 25);
		
		spalte1.add(lSumme);
		spalte2.add(lMittelwert);
		spalte3.add(lStandardabweichung);
		
		for(int i = 0; i < x; i++)
		{
			JComboBox cbMessdaten = new JComboBox(Messdaten);
			cbMessdaten.setBounds(0, 25*i+25, 150, 25);
			JCheckBox sumBox = new JCheckBox();
			sumBox.setBounds(0, 25*i+25, 25, 25);
			JCheckBox mitBox = new JCheckBox();
			mitBox.setBounds(0, 25*i+25, 25, 25);
			JCheckBox staBox = new JCheckBox();
			staBox.setBounds(0, 25*i+25, 25, 25);
			
			comboBoxList.add(cbMessdaten);
			checkBoxListSum.add(sumBox);
			checkBoxListMit.add(mitBox);
			checkBoxListSta.add(staBox);
			
			spalte0.add(cbMessdaten);
			spalte1.add(sumBox);
			spalte2.add(mitBox);
			spalte3.add(staBox);
			
			
		}
		
		add(Frage1);
		add(spalte0);
		add(spalte1);
		add(spalte2);
		add(spalte3);
		add(Weiter2);
		
		Weiter2.addActionListener(new WeiterButton0 (comboBoxList));
		Weiter2.addActionListener(new WeiterButton (checkBoxListSum));
		Weiter2.addActionListener(new WeiterButton2 (checkBoxListMit));
		Weiter2.addActionListener(new WeiterButton3 (checkBoxListSta));
	}
	
	private class WeiterButton0 implements ActionListener 
	{
		List<JComboBox> comboBoxList;
	
		public WeiterButton0(List<JComboBox> list0) 
			{
			comboBoxList = list0;
			}
		
		public void actionPerformed(ActionEvent event) 
			{
			
			for(int i = 0; i < comboBoxList.size(); i++)
				{
				JComboBox combo = comboBoxList.get(i);
				String item = (String)combo.getSelectedItem();
						
				}
					
			}
				
		}
		
	
		
	private class WeiterButton implements ActionListener 
		{
		List<JCheckBox> checkBoxListSum;
		
		

		public WeiterButton(List<JCheckBox> list) 
			{
			checkBoxListSum = list;
			}
		
		public void actionPerformed(ActionEvent e) 
			{
			
			
			for(int i = 0; i < checkBoxListSum.size(); i++)
				{
				if (checkBoxListSum.get(i).isSelected()) 
					{
					System.out.println("Box "+i+ " ist ausgewählt");
					a = 1;
					} 
				else 
					{
					
					}
				
		
				}
			
			}
		
		}
	
	public class WeiterButton2 implements ActionListener 
		{
		List<JCheckBox> checkBoxListMit;

		public WeiterButton2(List<JCheckBox> list2) 
			{
			checkBoxListMit = list2;
			}
		
		public void actionPerformed(ActionEvent e) 
			{
			for(int i = 0; i < checkBoxListMit.size(); i++)
				{
				if (checkBoxListMit.get(i).isSelected()) 
					{
					System.out.println("Box "+i+ " ist ausgewählt");
					b = 1;
					} 
				else 
					{
				
					}
				
		
				}
			
			}
		
		
		}
	
	private class WeiterButton3 implements ActionListener 
		{
		List<JCheckBox> checkBoxListSta;
		
		
		public WeiterButton3(List<JCheckBox> list3) 
			{
			checkBoxListSta = list3;
			}
		
		public void actionPerformed (ActionEvent e) 
			{
			for(int i = 0; i < checkBoxListSta.size(); i++)
				{
				if (checkBoxListSta.get(i).isSelected()) 
					{
					System.out.println("Box "+i+ " ist ausgewählt");
					c = 1;
					} 
				else 
					{
				
					}
				
		
				}
			
			Reihen = a + b + c;
			
			System.out.println("Anzahl zusätzliche Reihen: " + Reihen);
			
			close2();
			Fenster3 window3 = new Fenster3 ();
			window3.setVisible(true);
			
			}
		
		}
	


public void close2() 
	{
		
	WindowEvent winClosingEvent = new WindowEvent(this,WindowEvent.WINDOW_CLOSING);
	Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(winClosingEvent);
		
	}
}

Es handelt sich um die Variablen AnzMessdaten und AnzMessungen, die ich gerne übergeben würde.

Wäre echt prima, wenn mir da jemand weiterhelfen könnte
Danke
 

I2oxxi

Mitglied
du machst einfach sowas
Java:
//in fesnter1
*User macht eingabe und klickt auf irgendwas* (z.B: JButton)
int i = *Usereingabe* (z.B. Integer.ParserInt(JTextField.getText()))

//in fenster 2 den konstruktor anpassen
public Fenster2(int i)
this.i=i;

//und in fenster1 wird fenster2 halt die variable übergeben
*nach Usereingabe und einlsen*
Fenster2 f2 = new Fenster2(i);

mit 2 variablen ist halt so gut wie das gleiche ^^
also für dich nur die wichtigen stellen nochmal:
Java:
            else {
                System.out.println("klappt!");
                close();
                Fenster2 window2 = new Fenster2 (AnzMessdaten, AnzMessungen);
                window2.setVisible(true);
            }
Java:
int d,e;
public Fenster2 (int d, int e)
    {
         this.d=d;
         this.e=e
         ...............
    }
 
Zuletzt bearbeitet:

sheel

I love Asm
Hi

Einfach dem Konstruktor per Parameter übergeben.
Code 1, Zeile 108 wird zu
Java:
Fenster2 window2 = new Fenster2 (AnzMessdaten, AnzMessungen);
Code 2, Zeile 35 wird zu
Java:
public Fenster2 (int AnzMessdaten, int AnzMessungen);

Gruß
 

Ossiost

Grünschnabel
Tausend Dank, ich such schon seit Tagen danach und hab mir gedacht so schwer kann das doch eingentlich nicht sein :D
 

Ossiost

Grünschnabel
Ich habe leider noch ein Problem mit dem Quelltext und zwar in Zeile 237 vom 2.Fenster da möchte ich jetzt nochmal die Variable "AnzMessdaten" verwenden

Code:
public Fenster2 ()
	{
		super("Fenster 2");
		int x = AnzMessdaten;

...

Reihen = x + a + b+ c;

Das Problem ist ich bekomme die Fehlermeldung "The field Component x is not visible". Auch habe ich das Problem, dass die Variablen a und b in der Rechnung immer als 0 gerechnet werden, selbst wenn die entsprechenden Checkboxen ausgewählt sind und sie eigentlich den Wert 1 haben sollten.

Könnt ihr mir sagen was ich da falsch mache? Bin leider totaler Anfänger bei Java

Gruß
Ossiost
 

sheel

I love Asm
Zurzeit übergibst du die Variablen an den Konstruktor vom zweiten Fenster.
Dh. es hat die Werte mal und kann damit irgendwas machen,
während das Fenster im Konst. erstellt wird.

Sowas wie ein Buttonklick ist aber eine eigene Methode in der Klasse, die gehört nicht zum Konstruktor. Und Variablen, die innerhalb von bestimmten {} gemacht werden gibts außerhalb davon nicht mehr.

Mach die zwei Variablen auf Klassenebene (so wie beim ersten Fenster).
Denen weist du dann im Konstruktor die übergebenen Werte zu.
Dann kannst du sie auch in der restlichen Klasse verwenden.

Btw., zum Lernen von sowas hilft ein Blick in die (oder auch Komplettlektüre der) Javainsel:
http://openbook.galileocomputing.de/javainsel/
 

Ossiost

Grünschnabel
Danke,
also das mit dem Deklarieren der Variablen in der Klasse hat geklappt, nur mit dem anderen Problem von a und b und c bin ich nicht weiter. Du hast ja gesagt, dass Variablen die innerhalb einer Methode also in diesem Fall dem Buttonklick deklariert sind nicht außerhalb benutzt werden können. Ich habe die Variablen a, b und c ja extra auch in der klasse Deklariert aber er übernimmt die werte leider nicht. Hast du denn eine Idee wie ich das machen kann?

Danke für den Link, habe da schon öfter was nachgeschlagen nur bei machen Sachen bin ich damit leider nicht weiter gekommen :)

Gruß Ossiost
 

Ossiost

Grünschnabel
er rechnet einfach mit 0 für a und b auch wenn eine Checkbox aus deren Arraylist ausgewählt ist. also kommt bei mir jetzt für Reihen, wenn ich aus jeder Liste eine Box auswähle der wert für x + c . also für c übernimmt er die 1
 

I2oxxi

Mitglied
Edit: ups hab mich vertan warte ich schau nochmal drüber. kannst du den vollständigen code den du jetz hast nochmal posten das ich den schnell mal kopieren und genau nachgcken kann? ^^
desweiteren würd ich deine weiterbuttons zusammen fassen, das was du machst ist nicht nötig da die fast das gleiche machen, warte, ich mach mal eben was ^^

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

import javax.swing.JCheckBox;


public class WeiterButton implements ActionListener {
	
	private List<JCheckBox> checkBoxList;
	private int a = 0;

	public WeiterButton(List<JCheckBox> list)
	{
		this.checkBoxList=list;
	}
	
	public int getWert()
	{
		return a;
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		for(int i = 0; i < checkBoxList.size(); i++)
        {
        if (checkBoxList.get(i).isSelected()) 
            {
            System.out.println("Box "+i+ " ist ausgewählt");
            a = 1;
            } 
        else 
            {
        
            }
        

        }
	}
}
das könntes du z.B. für button und button2 nehmen, die machen nähmlich exakt das gleiche.
der wert (a,b,c) wird am ende durch Weiterbutton.getwert() geholt, haben die objekte ja in ihrer klassenvariable dann drin. weiterbutton3 folgt gleich ^^
Java:
import java.awt.event.ActionEvent;
import java.util.List;

import javax.swing.JCheckBox;


public class WeiterButton3 extends WeiterButton{

	private int reihen;
	private WeiterButton[] buttons;
	
	public WeiterButton3(List<JCheckBox> list,WeiterButton[] b) {
		super(list);
		buttons=b;
		// TODO Auto-generated constructor stub
	}
	
	public void actionPerformed(ActionEvent e){
		super.actionPerformed(e);
		reihen= buttons[0].getWert()+buttons[1].getWert() + super.getWert();
         //hier steht sogesehen dein a+b+c was du dir später über die getReihen Methode von diesem Objekt lesen kannst
	}
	
	//close und so dann in die gui schieben (wäre besser)

	public int getReihen()
	{
		return reihen;
	}
}

kannst du natürlich nach belieben auch als private class machen, nur die die das gleiche machen brauchste nicht immer neu machen, so wie du es tust, das ist ja eines der guten sachen an OOP.
Dein Weiterbutton0 hat mit den anderen leider nicht viel gemeinsam.
Aber ohne vollständigen aktuellen code kann ich da jetzt nicht feststellen wieso der a und b nicht nimmt.
aber ich würd nich das setvisible ans ende der gui setzen.
btw: wieso machst du es in der klasse und dann dann wenn du das objekt hast nochmal?
 
Zuletzt bearbeitet: