Ereignisbehandlung, ActionListener, ActionEvent

killabeez

Mitglied
Das hier ist ein kleines Programm, indem man zwei Operanden eingeben kann, und drückt man auf eine Grundrechenart, plus, minus, mal, geteilt erscheint die Lösung.
Das Ziel ist es die Ereignisbehandlung für alle JButtons auf einer anderen Klasse zu erstellen, nämlich in einer Klasse OperatorListener welches ActionListener implementiert.

Ich habe eine Lösung, in der eine innere Klasse benutzt wird. Jetzt wollte ich das gleiche ohne eine innere Klasse, sondern mit einer normalen Klasse lösen. Ist das möglich, ohne in der Klasse RechenFrame Änderungen vorzunehmen (Beispiel getter) ? Mich interessiert es aus Übungszwecken, wie ich das auch anderst lösen könnte.
Wäre eine Lösung auch möglich in dem OperatorListener von RechenFrame erbt? Habe keine andere Lösung hinbekommen die funktioniert.

Freue mich auf euere Ideen.

Hier nur die Klasse RechenFrame:
Java:
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class RechenFrame extends JFrame {

	private static final long serialVersionUID = 3211418102894914613L;
	private JTextField operand1, operand2;
	private JButton plus, minus, mal, geteilt;
	private JLabel ergLabel;

	public RechenFrame() {

		setLayout(new GridLayout(0, 4));
		add(new JLabel("Operand 1:", JLabel.RIGHT));

		operand1 = new JTextField(4);
		add(operand1);

		add(new JLabel("Operand 2:", JLabel.RIGHT));
		operand2 = new JTextField(4);
		add(operand2);
		add(plus = new JButton("+"));
		plus.addActionListener(new OperatorListener('+'));
		add(minus = new JButton("-"));
		minus.addActionListener(new OperatorListener('-'));
		add(mal = new JButton("*"));
		mal.addActionListener(new OperatorListener('*'));
		add(geteilt = new JButton("/"));
		geteilt.addActionListener(new OperatorListener('/'));

		add(new JLabel("Ergebnis: ", JLabel.RIGHT));
		add(ergLabel = new JLabel(""));
		ergLabel.setOpaque(true);
		ergLabel.setBackground(Color.WHITE);
	}

	public static void main(String[] args) {
		RechenFrame Rechenfenster = new RechenFrame();
		Rechenfenster.setTitle("RechenFrame");
		Rechenfenster.setSize(300, 100);
		Rechenfenster.setVisible(true);
		Rechenfenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

}

Hier die Lösung mit der inneren Klasse OperatorListener:
Java:
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class RechenFrame extends JFrame {

	private static final long serialVersionUID = 3211418102894914613L;
	private JTextField operand1, operand2;
	private JButton plus, minus, mal, geteilt;
	private JLabel ergLabel;

	public RechenFrame() {

		setLayout(new GridLayout(0, 4));
		add(new JLabel("Operand 1:", JLabel.RIGHT));

		operand1 = new JTextField(4);
		add(operand1);

		add(new JLabel("Operand 2:", JLabel.RIGHT));
		operand2 = new JTextField(4);
		add(operand2);
		add(plus = new JButton("+"));
		plus.addActionListener(new OperatorListener('+'));
		add(minus = new JButton("-"));
		minus.addActionListener(new OperatorListener('-'));
		add(mal = new JButton("*"));
		mal.addActionListener(new OperatorListener('*'));
		add(geteilt = new JButton("/"));
		geteilt.addActionListener(new OperatorListener('/'));

		add(new JLabel("Ergebnis: ", JLabel.RIGHT));
		add(ergLabel = new JLabel(""));
		ergLabel.setOpaque(true);
		ergLabel.setBackground(Color.WHITE);
	}
	
	class OperatorListener implements ActionListener {
		char oper;

		OperatorListener(char oper) {
			this.oper = oper;
		}

		public void actionPerformed(ActionEvent e) {
			try {
				double op1 = Double.valueOf(operand1.getText()).doubleValue();
				double op2 = Double.valueOf(operand2.getText()).doubleValue();
				double erg;
				if (oper == '+')
					erg = op1 + op2;
				else if (oper == '-')
					erg = op1 - op2;
				else if (oper == '*')
					erg = op1 * op2;
				else
					erg = op1 / op2;
				ergLabel.setText("" + erg);
			} catch (Exception ex) {
				ergLabel.setText("Unzulaessige Eingabe!");
			}
		}
	}

	public static void main(String[] args) {
		RechenFrame Rechenfenster = new RechenFrame();
		Rechenfenster.setTitle("RechenFrame");
		Rechenfenster.setSize(300, 100);
		Rechenfenster.setVisible(true);
		Rechenfenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

}
 
hi,
man könnte es mit einer minimalen änderung machen: du machst die JButtons public. dann kannst du aus einer anderen klasse auf sie zugreifen
javampir
 
hi,
man könnte es mit einer minimalen änderung machen: du machst die JButtons public. dann kannst du aus einer anderen klasse auf sie zugreifen
Und am besten auch noch static, damit auch die Objekte auf die Buttons zugreifen können, die keine Referenz auf eine RechenFrame Instanz haben?
Nenene, so nich:noe:
Mein Vorschlag: Du übergibst dem OperatorListener Referenzen auf operand1, operand2 und ergLabel. Dann kannst du in der actionPerformed darauf zugreifen, ohne eine Referenz auf die komplette Rechenframe-Klasse halten zu müssen.
 
also, ich finde das ja schon sinnig. wenn ich beispielsweise einen dialog in eine eigene klasse auslagere oder so was dann habe ich sowieso eine instanz in der tatsächlichen gui. dann kann man das wunderbar machen.
von static war nie die rede, das wäre natürlich blödsinn
 

Neue Themen


Zurück
Oben