Liebe Java Gemeinde,
Ich komme an einem minimalen Teil einer Aufgabe nicht weiter, ansonsten habe ich alles wunderbar funktionstüchtig hinbekommen.
Es geht um einen "Taschenrechner" in dem man über eine ComboBox die Rechenart auswählen kann. Das Funktioniert auch alles bestens, nur soll es auch so sein, dass er automatisch beim verändern der Rechenart direkt neu rechnet und das Ergebnis promt anzeigt.
Ja ja, gut so weit. Setzt man einen Listener auf die Combobox, aber das bekomme ich aus irgendwelchen Gründen nicht hin.... Sieht jemand von euch den Fehler?
Liebsten Dank!!!!
Der Listener ist bei Z. 70 und das Panel in Z. 154
Ich komme an einem minimalen Teil einer Aufgabe nicht weiter, ansonsten habe ich alles wunderbar funktionstüchtig hinbekommen.
Es geht um einen "Taschenrechner" in dem man über eine ComboBox die Rechenart auswählen kann. Das Funktioniert auch alles bestens, nur soll es auch so sein, dass er automatisch beim verändern der Rechenart direkt neu rechnet und das Ergebnis promt anzeigt.
Ja ja, gut so weit. Setzt man einen Listener auf die Combobox, aber das bekomme ich aus irgendwelchen Gründen nicht hin.... Sieht jemand von euch den Fehler?
Liebsten Dank!!!!
Der Listener ist bei Z. 70 und das Panel in Z. 154
Java:
package de.fernschulen.taschenrechnerv2;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.text.DecimalFormat;
import javax.swing.JButton;
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.border.TitledBorder;
public class TaschenrechnerGUIV2 extends JFrame{
//automatisch �ber Eclipse eingef�gt
private static final long serialVersionUID = 3006212012028893840L;
//die Komponente
//zwei Eingabefelder
private JTextField eingabe1, eingabe2;
private String[] rechenoperatoren = {"Addition", "Subtraktion", "Multiplikation", "Division"}; //Das Array mit den Rechenoperatoren vereinbaren
private JComboBox <String> auswahl; //Das Kombinationsfeld vereinbaren
//zwei Schaltfl�chen
private JButton schaltflaecheBerechnen, schaltflaecheBeenden;
//ein Label f�r die Ausgabe
private JLabel ausgabe;
//die innere Klasse f�r die Ereignisverarbeitung
class MeinListener implements ActionListener, ItemListener{
@Override
public void actionPerformed(ActionEvent e) {
//wurde auf Beenden geklickt?
//dann das Programm beenden
if (e.getActionCommand().equals("ende"))
System.exit(0);
//wurde auf Berechnen geklickt?
//dann eine Methode f�r die Berechnung aufrufen
//und das Ergebnis anzeigen
if (e.getActionCommand().equals("rechnen"))
ausgabe.setText(berechnen());
}
@Override
public void itemStateChanged(ItemEvent e) {
Object ausloeser = e.getSource(); //Die Ereignisquelle ermitteln und in einer Variablen speichern
if (ausloeser instanceof JComboBox) { //Wenn die Ereignisquelle das Kombinationsfeld ist, dann wird die jeweilige Rechenart ausgeführt
berechnen();
}
}
}
//der Konstruktor
public TaschenrechnerGUIV2(String titel) {
super(titel);
//insgesamt 4 Panels
JPanel panelEinAus, panelBerechnung, panelButtons, gross;
//die Panels �ber die Methoden erstellen
panelEinAus = panelEinAusErzeugen();
panelBerechnung = panelBerechnungErzeugen();
panelButtons = panelButtonErzeugen();
//das Border-Layout benutzen
//es ist Standard und muss nicht gesetzt werden
//die Panels hinzuf�gen
//die beiden gr��eren Panel fassen wir noch einmal zusammen
gross = new JPanel();
gross.add(panelEinAus);
gross.add(panelBerechnung);
//die beiden kommen in die Mitte
add(gross,BorderLayout.CENTER);
//das Panel mit den Buttons nach rechts
add(panelButtons, BorderLayout.EAST);
//die Standard-Aktion setzen
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//packen und anzeigen
pack();
setVisible(true);
//Gr��en�nderungen sind nicht zugelassen
//damit das m�hsam erstellte Layout nicht durcheinander kommt
setResizable(false);
}
//die Methode erzeugt das Panel f�r die Ein- und Ausgabe
//und liefert es zur�ck
private JPanel panelEinAusErzeugen() {
JPanel tempPanel = new JPanel();
//es enth�lt die Eingabefelder mit beschreibendem Text und die Ausgabe
//die L�nge der Felder ist auf 10 Zeichen beschr�nkt
eingabe1 = new JTextField(10);
eingabe2 = new JTextField(10);
ausgabe = new JLabel("");
//das Panel bekommt ein GridLaoyut mit 2 Spalten und etwas Abstand
tempPanel.setLayout(new GridLayout(0,2,10,10));
//ein beschreibendes Label f�r die erste Eingabe
tempPanel.add(new JLabel("Zahl 1:"));
//das erste Eingabefeld
tempPanel.add(eingabe1);
//und jetzt das zweite Eingabefeld
tempPanel.add(new JLabel("Zahl 2: "));
tempPanel.add(eingabe2);
//und nun das Ausgabefeld f�r das Ergebnis
tempPanel.add(new JLabel("Ergebnis: "));
tempPanel.add(ausgabe);
//einen Rahmen um das Panel ziehen
tempPanel.setBorder(new TitledBorder("Ein- und Ausgabe"));
//das Panel zur�ckliefern
return tempPanel;
}
//die Methode erzeugt das Panel f�r die Auswahl
//der Rechenoperation und liefert es zur�ck
private JPanel panelBerechnungErzeugen() {
JPanel tempPanel = new JPanel();
auswahl = new JComboBox<String> (rechenoperatoren); //Das Kombinationsfeld erzeugen und es mit den Daten aus dem Array füllen
tempPanel.setLayout(new FlowLayout()); //Das Flow-Layout für das Panel wählen
tempPanel.add(auswahl); //Das Kombinationsfeld in das Panel einfügen
MeinListener listener = new MeinListener();
auswahl.addItemListener(listener); //Den Listener mit dem Kombinationsfeld verbinden
//und einen Rahmen
tempPanel.setBorder(new TitledBorder("Operation: "));
//das Panel zur�ckliefern
return tempPanel;
}
//die Methode erzeugt das Panel f�r die Schaltfl�chen
//und liefert es zur�ck
private JPanel panelButtonErzeugen() {
JPanel tempPanel = new JPanel();
schaltflaecheBeenden = new JButton(" Beenden ");
//das Aktion-Command setzen
schaltflaecheBeenden.setActionCommand("ende");
schaltflaecheBerechnen = new JButton("Berechnen");
schaltflaecheBerechnen.setActionCommand("rechnen");
//Zwischenpanel f�r die Schaltfl�chen
//ebenfalls ein GridLayout
tempPanel.setLayout(new GridLayout(0,1));
tempPanel.add(schaltflaecheBerechnen);
//ein leeres Label einf�gen
tempPanel.add(new JLabel());
tempPanel.add(schaltflaecheBeenden);
//die Schaltfl�chen mit dem Listener verbinden
MeinListener listener = new MeinListener();
schaltflaecheBeenden.addActionListener(listener);
schaltflaecheBerechnen.addActionListener(listener);
//das Panel zur�ckliefern
return tempPanel;
}
//die Methode berechnet das Ergebnis und liefert es als
//Zeichenkette zur�ck
private String berechnen() {
//ergebnis muss initialisiert werden
double zahl1, zahl2, ergebnis = 0;
boolean fehlerFlag = false;
//jetzt mit Fehlerbehandlung und Ausgabe der Meldung durch eine eigene Methode
try {
zahl1 = Double.parseDouble(eingabe1.getText());
}
catch (Exception NumberFormatException) {
fehlermeldung(eingabe1);
return ("Nicht definiert");
}
try {
zahl2 = Double.parseDouble(eingabe2.getText());
}
catch (Exception NumberFormatException) {
fehlermeldung(eingabe2);
//das Ergebnis ist nicht definiert
return ("Nicht definiert");
}
//welche Operation ist ausgew�hlt?
if (auswahl.getSelectedIndex() == 0) //Die Rechenoperation wird direkt über den Index das Arrays abgefragt
ergebnis = zahl1 + zahl2;
if (auswahl.getSelectedIndex() == 1)
ergebnis = zahl1 - zahl2;
if (auswahl.getSelectedIndex() == 2)
ergebnis = zahl1 * zahl2;
//bei der Division �berpr�fen wir den zweiten Wert auf 0
if (auswahl.getSelectedIndex() == 3) {
if (zahl2 != 0)
ergebnis = zahl1 / zahl2;
else
fehlerFlag = true;
}
//wenn es keine Probleme gegeben hat, liefern wir das Ergebnis zur�ck
if (fehlerFlag == false) {
//die Formatvorgabe �ber die Klasse DecimalFormat
DecimalFormat formatFolge = new DecimalFormat("0.##");
//das Format anwenden, das Ergebnis ist eine Zeichenkette
return (formatFolge.format(ergebnis));
}
else
return ("Nicht definiert");
}
private void fehlermeldung(JTextField eingabefeld) {
JOptionPane.showMessageDialog(this, "Ihre Eingabe ist nicht g�ltig","Eingabefehler", JOptionPane.ERROR_MESSAGE);
eingabefeld.requestFocus();
}
}