Variabeln aus einer andere Klasse dauerhaft einen anderen Wert übergeben

osion

Bekanntes Mitglied
Hallo...so jetzt bin ich bei Formular :lol:

Aufgabe: Formular mit Buttons öffnet sich (Minus,Plus,geteillt,Mal).

Meine Umsetzung ist evtl. nicht die Sinnvolste doch will ich noch ein wenig Klassenübergreifende Aktionen lernen.

Idee:
1. Klasse mit den Mathe-Übungen-Ausrechnungen.
2. 2 Formulare (1 Hauptformular mit der Abfrage was ich rechnen will (+,-,/,*) und ein zweites Formular welches mit denn Übungen aufgerufen wird

Problem: Ich will dass das erste Formular den String aus der Classe ändert (+,-,*) und beim zweiten Formular automatisch eingeführt wird.

z. B. beim klicken von + soll plus angezeigt werden.

Irgendwie bekomme ich immer null, ausser es ist schon ein Vordefinierter Wert in der Klasse vorhanden.

Classe:

Java:
package schule_mathe;

public class Mathe {
	public int zahl1;
	public int zahl2;
	public int anzahl;
	public int erg;
	public String zeichen;

	public void minus()
	{
	 zahl1=(int)(Math.random()*anzahl);
	 zahl2=(int)(Math.random()*anzahl);
	 erg=zahl1-zahl2;
	 zeichen = "-";
	 System.out.println(zahl1);
	}
	public void plus()
	{
		 zahl1=(int)(Math.random()*anzahl);
		 zahl2=(int)(Math.random()*anzahl);
		 erg=zahl1+zahl2;
		 zeichen = "+";
		 System.out.println(zahl1);
	}
	public void mal()
	{
		 zahl1=(int)(Math.random()*anzahl);
		 zahl2=(int)(Math.random()*anzahl);
		 erg=zahl1*zahl2;
		 zeichen = "*";
	}
	public void geteilt()
	{
		 zahl1=(int)(Math.random()/anzahl);
		 zahl2=(int)(Math.random()/anzahl);
		 erg=zahl1/zahl2;		
		 zeichen = "/";
	}
}


Teil aus dem Hauptformular:

Java:
	btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				Mathe geteilt= new Mathe();
				geteilt.zeichen="/";
				dispose();
				new Uebung().setVisible(true);
			}


Teil aus dem zweiten Formular

Java:
		Mathe gleich=new Mathe();
		txt_gleichheitszeichen.setText(gleich.zeichen);

Ich frage mich, wie ich die Werte dauerhaft übergeben kann, aber habe nach stundenlangen ausprobieren und rechergen nichts gefunden ;(
 
Hm, du hast ja nun im Code zwei verschiedene Mathe-Objekte erzeugt, eins in dem ActionListener, und ein anderes (!) in dem "zweiten Formular".

Im Text schreibst du aber, dass das zweite Formular dasselbe Objekt bekommen soll.
Habe ich das nun richtig verstanden?

Wenn Uebung dein zweites Formular ist, könntest du doch eine Variable vom Typ Mathe in Uebung
einbauen, und einen setter (also z.B. Uebung.setCalculation(MyMathe)) einbauen.
Dann kannst du Uebung dasselbe Mathe-Objekt verpassen wie in Formular 1 (so sollte das ja sein,
falls ich deinen Text richtig kapiert hab).

freundliche Grüße

Olli
 
was auf jeden Fall nicht geht, ist, beim Programmstart dem Textfeld einen einfachen String (gleich.zeichen) zu übergeben
und anzunehmen, dass sich das für den Rest des Programms bei Änderungen immer automatisch aktualisiert,
dafür ist String zu simpel,

unmöglich wäre es nicht, etwa hat jedes TextFeld ein Document im Hintergrund, so wie ein Table ein TableModel, falls dir das was sagt,
der normalere Weg für den Anfang wäre aber, bei Änderungen von 'zeichen' auch wieder einen setText()-Aufruf am TextFeld auszuführen,

auch dabei kann man viel falsch machen, z.B. zu viele Objekte erzeugen, 2x new Mathe() im geposteten Code ist schon verdächtig,
womöglich steht in dem einen Mathe-Objekt der korrekte Wert, aus dem anderen wird noch der Default-Wert gelesen usw.

es braucht bei sowas eher möglichst vollständigen Code und genaue Verfolgung des Ablaufs
 
Hm, du hast ja nun im Code zwei verschiedene Mathe-Objekte erzeugt, eins in dem ActionListener, und ein anderes (!) in dem "zweiten Formular".

Im Text schreibst du aber, dass das zweite Formular dasselbe Objekt bekommen soll.
Habe ich das nun richtig verstanden?

Wenn Uebung dein zweites Formular ist, könntest du doch eine Variable vom Typ Mathe in Uebung
einbauen, und einen setter (also z.B. Uebung.setCalculation(MyMathe)) einbauen.
Dann kannst du Uebung dasselbe Mathe-Objekt verpassen wie in Formular 1 (so sollte das ja sein,
falls ich deinen Text richtig kapiert hab).

freundliche Grüße

Olli

Jo habe es so gemacht....cool danke ^^
 
So jetzt noch ein wenig rumgebastelt...

Idee: In Mathe werden die Zahlen gerechnet und mit einem Return zurückgegeben, dass ich mehrere Werte zurückgeben kann, machte ich ein Array. Soweit funktioniert alles.

Situation: Die Klasse mathe die Methode Minus() ist so gestaltet das der Compilier nicht motzt.

Problem: Wenn ich das so mache motzt er beim Uebung das er "public int[] minus(int i) {" zu "public int minus(int i) {" ändern will, aber dann motzt er wieder bei Mathe.

Klasse mathe nur MINUS wurde hier verändert (Testzwecken)

Java:
package schule_mathe;

public class Mathe {
	private int zahl1;
	private int zahl2;
	private int anzahl;
	private int erg;
	private String zeichen;

	
	public int[] minus(int i) {
		int[] zahlen=new int[4];
		zahl1=(int) ((Math.random() * anzahl));
		zahl2=(int) ((Math.random() * anzahl));
		erg= zahl1 - zahl2;
		zeichen="-";
		zahlen[0]= zahl1;
		zahlen[1]= zahl2;
		zahlen[2]= erg;


		return zahlen;
	}

	public int plus() {
		zahl1 = (int) (Math.random() * anzahl);
		zahl2 = (int) (Math.random() * anzahl);
		erg=zahl1 + zahl2;
		zeichen="+";
		System.out.println(zahl1);
		return zahl1;
	}

	public void mal() {
		zahl1 = (int) (Math.random() * anzahl);
		zahl2 = (int) (Math.random() * anzahl);
		erg=zahl1 * zahl2;
		zeichen="*";
	}

	public void geteilt() {
		zahl1 = (int) (Math.random() / anzahl);
		zahl2 = (int) (Math.random() / anzahl);
		erg= zahl1 / zahl2;
		zeichen="/";
	}

	public String getZeichen() {
		return zeichen;
	}

	public void setZeichen(String zeichen) {
		this.zeichen = zeichen; 
	}

	public int getErg() {
		return erg;
	}

	public void setErg(int erg) {
		this.erg = erg;
	}

	public int getZahl1() {
		return zahl1;
	}

	public void setZahl1(int zahl1) {
		this.zahl1 = zahl1;
	}

	public int getZahl2() {
		return zahl2;
	}

	public void setZahl2(int zahl2) {
		this.zahl2 = zahl2;
	}
}

Klasse Uebung

Java:
package schule_mathe;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextField;
import java.awt.Color;

public class Uebung extends JFrame {

	private JPanel contentPane;
	private JTextField txt_ergebnis;
	private JTextField txt_gleichheitszeichen;
	private JTextField txt_zahl2;
	private JTextField txt_zeichen;
	private JTextField txt_zahl1;
	public Mathe zeichen;
	public Mathe zahl1;
	public Mathe zahl2;

	public Uebung(Mathe zeichen) {

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 462, 174);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		txt_ergebnis = new JTextField();
		txt_ergebnis.setBounds(254, 52, 170, 20);
		contentPane.add(txt_ergebnis);
		txt_ergebnis.setColumns(10);

		txt_gleichheitszeichen = new JTextField();
		txt_gleichheitszeichen.setText("=");
		txt_gleichheitszeichen.setBounds(230, 52, 16, 20);
		contentPane.add(txt_gleichheitszeichen);
		txt_gleichheitszeichen.setColumns(10);
		txt_gleichheitszeichen.setEditable(false);

		txt_zahl2 = new JTextField();
		txt_zahl2.setEditable(false);
		txt_zahl2.setColumns(10);
		txt_zahl2.setBounds(134, 52, 86, 20);
		contentPane.add(txt_zahl2);

		txt_zeichen = new JTextField();
		txt_zeichen.setBackground(Color.WHITE);
		txt_zeichen.setColumns(10);
		txt_zeichen.setBounds(99, 52, 16, 20);
		contentPane.add(txt_zeichen);

		txt_zahl1 = new JTextField();
		txt_zahl1.setEditable(false);
		txt_zahl1.setForeground(Color.BLACK);
		txt_zahl1.setColumns(10);
		txt_zahl1.setBounds(3, 52, 86, 20);
		contentPane.add(txt_zahl1);
		
		
//		Übergaben und Änderungen vom Hauptfenster oder Main
		Mathe uebergabe=new Mathe();
		
		int zahlen[]=new int[4];
		zahlen[0]=uebergabe.minus(0);
		zahlen[1]=uebergabe.minus(1);
		zahlen[2]=uebergabe.minus(2);
		zahlen[3]=uebergabe.minus(3);
		txt_gleichheitszeichen.setText(zeichen.getZeichen());
		txt_zahl1.setText(String.valueOf(zahlen[0]));
		txt_zahl2.setText(String.valueOf(zahlen[1]));
		txt_zahl2.setText(String.valueOf(zahlen[2]));
	
	}
	
}
 
nur 'hier motzt xy' liest sich recht nervig, kannst du nicht alles in langen Sätzen darlegen?
eine Methode kann entweder nur einen Wert zurückgeben oder mehrere in einem Array,

dazu gibt es drei Dinge zu beachten
- a) am einfachsten und letzlich wenigsten wichtig die Signatur der Methode
- b) dann der Code der Methode, was wird zurückgegeben, was steht bei return usw.
- c) schließlich alle Aufrufer, die müssen entweder einen int oder mehrere verwerten

es klingt als wenn du nur a) veränderst, dass dann alles schlimm aussieht ist kein Wunder
 

Zurück
Oben