Reaktion auf Änderung im Kombinationsfeld

melaniemueller

Aktives Mitglied
Guten Abend,

bei einer Aufgabe mit einem Taschenrechner sollen die Rechenoperationen über ein Kombinationsfeld ausgewählt werden können (dies hab ich bereits erstellt und funktioniert) und zudem soll aber auch sobald nun von Addition auf Subtraktion gewechselt wird, diese Rechnung direkt ausgeführt werden ohne das zuerst auf die Schaltfläche "Berechnen" geklickt werden soll.

Mein Lösungsansatz war nun, dass ich einen ItemListener erstelle und dadurch auf Veränderungen reagiert wird.
Jedoch so wie ich es gelöst habe, funktioniert es nicht, es ändert nichts.

Hier einmal mein kompletter Quellcode:

Java:
package de.fernschulen.taschenrechnerv2;

import java.awt.BorderLayout;
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 java.text.NumberFormat;
import java.util.Locale;

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;
    //zwei Schaltflächen
    private JButton schaltflaecheBerechnen, schaltflaecheBeenden;
    //ein Label für die Ausgabe
    private JLabel ausgabe;
    private JComboBox <String> auswahl;
    
    //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());
        }
// hier mein Versuch des ItemListeners
        @Override
        public void itemStateChanged(ItemEvent e) {
        Object auslöser = e.getSource();
        if (auslöser instanceof JComboBox) {
            if (auswahl.getSelectedItem().equals("Addition"))
                berechnen();
            if (auswahl.getSelectedItem().equals("Subtraktion"))
                berechnen();
            if (auswahl.getSelectedItem().equals("Multiplikation"))
                berechnen();
            if (auswahl.getSelectedItem().equals("Division"))
                berechnen();
                
            
        }
            
        }
    }
    
    //der Konstruktor
    public TaschenrechnerGUIV2(String titel) {
        
        super(titel);
        
        //insgesamt vier 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ühhsam 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 zwei 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();
        // Anlegen eines Arrays für die verschiedenen Rechenoperationen
        String[] rechenOperationAuswahl = {"Addition", "Subtraktion", "Multiplikation", "Division"};
        auswahl = new JComboBox <String> (rechenOperationAuswahl);
        auswahl.setSelectedIndex(0);
        // hier habe ich den Listener hinzugefügt
        MeinListener listener = new MeinListener();
        auswahl.addItemListener(listener);
        
        //das Panel bekommt ein GridLaoyut mit 1 Spalte
        tempPanel.setLayout(new GridLayout(0, 1));
        tempPanel.add(auswahl);
        
        //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 {
            //für das Konvertieren
            Number wert = NumberFormat.getNumberInstance(Locale.GERMANY).parse(eingabe1.getText());
            zahl1 = wert.doubleValue();
        }
        catch (Exception ParseException) {
            fehlermeldung(eingabe1);
            //das Ergebnis ist nicht definiert
            return ("Nicht definiert");
        }
        
        try {
            //für das Konvertieren
            Number wert = NumberFormat.getNumberInstance(Locale.GERMANY).parse(eingabe2.getText());
            zahl2 = wert.doubleValue();
        }
        catch (Exception ParseException) {
            fehlermeldung(eingabe2);
            //das Ergebnis ist nicht definiert
            return ("Nicht definiert");
        }
        //welche Operation ist ausgewählt?
        if (auswahl.getSelectedIndex() == 0)
            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();
    }
}
 

melaniemueller

Aktives Mitglied
Du setzt das Ergebnis von "berechnen" nie irgendwohin.
Verstehe nicht genau was du meinst. Ich liefere doch das Ergebnis in der Methode berechnen() mit
Java:
 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));

zurück.
Und im Listener wird dies aufgerufen.
 
K

kneitzel

Gast
Oder um es noch einmal in Form von Code zu benennen:
Du hast an einer Stelle:
ausgabe.setText(berechnen());
==> Das Ergebnis wird also in Ausgabe geschrieben.

Jetzt hast Du aber lediglich den Aufruf von berechnen:
Java:
            if (auswahl.getSelectedItem().equals("Addition"))
                berechnen();
            if (auswahl.getSelectedItem().equals("Subtraktion"))
                berechnen();
            if (auswahl.getSelectedItem().equals("Multiplikation"))
                berechnen();
            if (auswahl.getSelectedItem().equals("Division"))
                berechnen();
Statt einfach nur berechnen() wäre da evtl. auch ein ausgabe.setText(berechnen()); notwendig gewesen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Wichtige Frage zu JTextField-Reaktion auf Änderung des Inhal AWT, Swing, JavaFX & SWT 6
MiMa Reaktion auf einen SplitScreenTrenner? AWT, Swing, JavaFX & SWT 2
K Swing Keine Reaktion auf Tastatureingaben bei mehreren Buttons??? AWT, Swing, JavaFX & SWT 4
W Swing Ausführung einer .jar zeigt keine Reaktion AWT, Swing, JavaFX & SWT 4
M Swing Focus für Buttons deaktiviert --> keine Reaktion mehr auf Tastendrücke AWT, Swing, JavaFX & SWT 5
0x7F800000 Allg. Frage zum ev. dispatch thread, wie korrekt auf reaktion der Listener warten? AWT, Swing, JavaFX & SWT 4
C JButton + JFrame Reaktion SEHR langsam. AWT, Swing, JavaFX & SWT 2
U Reaktion auf closing window AWT, Swing, JavaFX & SWT 7
U Auf Swings Reaktion warten AWT, Swing, JavaFX & SWT 3
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
kodela Swing Letzte Änderung in der Tabelle wird nicht gespeichert AWT, Swing, JavaFX & SWT 5
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
L JSplitPane - auf Änderung reagieren AWT, Swing, JavaFX & SWT 4
S Swing Bild auf jPanel nach Änderung von JComboBox zeichnen AWT, Swing, JavaFX & SWT 4
G JScrollPane reagiert nicht auf Änderung der JPanel-Größe AWT, Swing, JavaFX & SWT 4
A Swing Suche Listener für beliebige Änderung an GUI Items/Controls AWT, Swing, JavaFX & SWT 8
TheWhiteShadow JList-Inhalt nach Änderung weg AWT, Swing, JavaFX & SWT 3
H Swing Auf Änderung bei JRadioButton reagieren. AWT, Swing, JavaFX & SWT 3
C Swing Änderung der Tastatur-Navigation in einer JTable AWT, Swing, JavaFX & SWT 4
G Components erscheinen erst bei Änderung des Frames AWT, Swing, JavaFX & SWT 3
N Swing Dynamisches Verhalten bei Änderung Fenstergröße AWT, Swing, JavaFX & SWT 6
P Bilder werden nach Änderung nicht angezeigt AWT, Swing, JavaFX & SWT 15
P Swing Event das ausgelöst wird, sobald Änderung der Größe Abgeschlossen ist AWT, Swing, JavaFX & SWT 4
D LayoutManager GridBagLayout, Änderung zur Laufzeit AWT, Swing, JavaFX & SWT 4
jueki Event bei Änderung der Spaltenbreite in einem JTable AWT, Swing, JavaFX & SWT 15
S Swing JTable nach einer Änderung einer Zelle komplett aktualisieren. AWT, Swing, JavaFX & SWT 10
Milady Swing Änderung von Daten mit sql AWT, Swing, JavaFX & SWT 2
E 2 Frames - eine Änderung AWT, Swing, JavaFX & SWT 4
T JTable erst nach Änderung der Spaltenbreite neu zeichnen AWT, Swing, JavaFX & SWT 10
Balbes Änderung des Wertes von JCheckBox in einer JTable AWT, Swing, JavaFX & SWT 4
I Swing Bild wird erst bei manueller Änderung der Fenstergrösse gezeichnet AWT, Swing, JavaFX & SWT 3
hdi Swing setPreferredSize zeigt keine Änderung AWT, Swing, JavaFX & SWT 2
F JFrame Änderung der Größe erkennen AWT, Swing, JavaFX & SWT 2
J Font Änderung nach Editorwechsel? AWT, Swing, JavaFX & SWT 3
M JTable alte Daten vor Änderung abfangen AWT, Swing, JavaFX & SWT 11
B Auf Fenster Pos.Änderung reagieren und 2. Fenster andocken AWT, Swing, JavaFX & SWT 10
J jTable, welcher listener für Änderung der Spaltenbreite AWT, Swing, JavaFX & SWT 2
P Änderung der Fenstergrösse abragen und reagieren. AWT, Swing, JavaFX & SWT 3
G Bei Änderung an einem Texfeld in SWT eine Aktion AWT, Swing, JavaFX & SWT 3
S JTree - bei Änderung in DB neu zeichnen AWT, Swing, JavaFX & SWT 5
G Dringend ! SWT-Table übernimmt Änderung nicht AWT, Swing, JavaFX & SWT 2
B JTable - Letzte Änderung wird nicht übernommen AWT, Swing, JavaFX & SWT 5
G Auf Fenstergrößen-Änderung reagieren AWT, Swing, JavaFX & SWT 10
J JTable Änderung erst beim Zeilenwechsel AWT, Swing, JavaFX & SWT 5
M JTree nach LaF-Änderung komisch AWT, Swing, JavaFX & SWT 4
M GUI-Repaint nach Änderung der Fenstergröße AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben