Taschenrechner

thor_norsk

Bekanntes Mitglied
Guten Morgen, ich habe einen Taschenrechner programmiert, und ich denke habe Alle Vorgaben laut Aufgabestellung umgesetzt, bis auf eine Sache, und zwar
sobald ich die Rechenoperation wechsle, zum Beispiel von der Addition auf Multiplikation über Kombinationsfeld, dann soll die Berechnung automatisch erfolgen.
Also: Ohne dass ich den Button Berechnen anklicke, soll die Berechnung erfolgen.
Vor Allem haben wir in unsere Unterlagen so einem Fall nicht behandelt. Es wäre super, wenn jemand auf mein Code eingeht ohne starke Veränderung, da ich noch Anfänger bin und starke Veränderung sorgen für Verwirrung. Zuerst möchte ich mich für eure Unterstützung bedanken.

Aufgabestellung:
Ändern Sie den Taschenrechner so, dass die Auswahl der Rechenoperation nicht mehr über eine Gruppe mit Optionsfeldern erfolgt, sondern über ein Kombinationsfeld.
Dabei gelten folgende Vorgaben:
- Erstellen Sie die Liste für das Kombinationsfeld über ein Array.
- Ermitteln Sie die Rechenart, die ausgeführt werden soll, direkt über den Index des ausgewählten Eintrags in der Liste des Kombinationsfelds.
- Sobald ein anderer Eintrag in dem Kombinationsfeld ausgewählt wurde, soll die Rechnung sofort ausgeführt werden.
- Sorgen Sie bei der Ereignisverarbeitung dafür, dass überprüft wird, welche Komponente das Ereignis ausgelöst hat.

Ich habe im Forum und Internet recherchiert, leider bin ich nicht weiter gekommen. Einige nehmen Veränderungen in dem ActionListener vor . Ich würde gerne meine Methode berechnen() beibehalten, wenn es ginge.
Auf jeden Fall wäre euch sehr dankbar für Lösungsansätze bzw. Lösungsvorschlag, ohne Alles komplett um zu programmieren.

Java:
public class TaschenrechnerV3_Test extends JFrame{

    private static final long serialVersionUID = 4668009235734676602L;
    
    //die Komponente
    //zwei Eingabefelder
    //jetzt mit Format-Vorgaben
    private JFormattedTextField eingabe1, eingabe2;
    //verfügbare Rechenoperationen werden in Array abgelegt.
    private String [] rechenOperation = {"Addition", "Subtraktion", "Division", "Multiplikation"};
    //die Daten kommen aus dem Array rechenOpertion.
    private JComboBox <String> auswahl = new JComboBox <String> (rechenOperation);
    //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 {
        
        @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());
            }
    }
    
    //der Konstruktor
    public TaschenrechnerV3_Test(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 der 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);
        add(panelEinAus,BorderLayout.WEST);
        //das Panel mit dem Kombinationsfeld in der Mitte
        add(panelBerechnung,BorderLayout.CENTER);
        //das Panel mit den Buttons nach rechts
        add(panelButtons, BorderLayout.EAST);
        
        add(auswahl);
        
        //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
        //für die Eingabefelder wird jetzt auch ein Format vorgegeben
        eingabe1 = new JFormattedTextField(new DecimalFormat("#.##"));
        eingabe2 = new JFormattedTextField(new DecimalFormat("#.##"));
        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();
        
        //das Panel bekommt ein GridLaoyut mit einer Spalte
        tempPanel.setLayout(new GridLayout(0, 1));   
        //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);
        
        tempPanel.add(auswahl);
        
        //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;
        
        //ungültige Werte können wegen der Maske nicht im Feld stehen
        //allerdings müssen wir die Ausnahme ParseException behandeln
        //da weisen wir einfach den Wert 0 zu
        try {
            Number wert = NumberFormat.getNumberInstance(Locale.GERMANY).parse(eingabe1.getText());
            zahl1 = wert.doubleValue();
        }
        catch (Exception ParseException) {
            zahl1 = 0;
        }
        
        try {
            //für das Konvertieren
            Number wert = NumberFormat.getNumberInstance(Locale.GERMANY).parse(eingabe2.getText());
            zahl2 = wert.doubleValue();
        }
        catch (Exception ParseException) {
            zahl2 = 0;
        }
    
        //welche Operation ist ausgewählt?
        if (auswahl.getSelectedIndex() == 0)
            ergebnis = zahl1 + zahl2;
        if (auswahl.getSelectedIndex() == 1)
            ergebnis = zahl1 - zahl2;
        if (auswahl.getSelectedIndex() == 3)
            ergebnis = zahl1 * zahl2;
        //bei der Division überprüfen wir den zweiten Wert auf 0
        if (auswahl.getSelectedIndex() == 2) {
            if (zahl2 != 0)
                ergebnis = zahl1 / zahl2;
            else
                fehlerFlag = true;
        }
        //wenn es keine Probleme gegeben hat, liefern wir das Ergebnis zurück
        if (fehlerFlag == false) {
            //das Ergebnis zurückgeben und umformen in String!
            return (Double.toString(ergebnis));
        }
        else
            return ("n. definiert!");
        }
    public static void main(String [] args) {
        new TaschenrechnerV3_Test("Taschenrechner_V3.0");
    }
}
 
Y

yfons123

Gast
````sarkasmus an````` ein fat16 (oder fat 32 weis nimmer )hat eine maximale datei größe von 4GB das wird kritisch ```````sarkasmus aus``````

ddu solltest oop programmieren und in klassen aufteilen dann lösen sich deine fehler von selber meistens
und die dämlichen kommentare kann man sich auch sparen
 

Robert Zenz

Top Contributor
und die dämlichen kommentare kann man sich auch sparen
Hihi, sehe ich auch so.

Ich habe im Forum und Internet recherchiert, leider bin ich nicht weiter gekommen. Einige nehmen Veränderungen in dem ActionListener vor . Ich würde gerne meine Methode berechnen() beibehalten, wenn es ginge.
Dann rufe diese in deinem ActionListener auf, irgendwo muss die Logik ohnehin zusammen flieszen. Ich verstehe gerade nicht wo dein Knoten ist, du hast doch die gesamte Infrastruktur dafuer bereits, dir fehlt nur die eine Zeile um auch auf Aenderungen in der Auswahl zu lauschen.

private static final long serialVersionUID = 4668009235734676602L;
Ich weisz Eclipse und andere IDEs bewarnen fehlende IDs, aber die Warnung kannst du effektiv ausschalten, es sei denn du hast vor die Klasse mit dem Standard-Java-Serialisierungs-Mechanismus ueber die Leitung zu schieben.
 

thor_norsk

Bekanntes Mitglied
Hallo, was meint ihr mit Kommentaren? In meinem Code?
Ansonsten schaue ich mir nochmal die Aufgabe an und hoffe finde den Fehler.
 

thor_norsk

Bekanntes Mitglied
Guten Abend, ich habe meinen Listener erweitert, aber funktioniert immer noch nicht.

Java:
class MeinListener implements ActionListener {
        
        @Override
        public void actionPerformed(ActionEvent e) {
            
            Object ausloeser = e.getSource();
            if ( ausloeser instanceof JButton) {
                if (e.getActionCommand().equals("ende"))
                System.exit(0);
            }
            if (ausloeser instanceof JComboBox) {
                if (e.getActionCommand().equals("rechnen")) 
                    ausgabe.setText(berechnen());
            }
        }
    }

Jetzt habe ich ein neues Problem, wenn ich Berechnen anklicke passiert garnichts:D
 
Y

yfons123

Gast
der sinn von actionlistener ist es KEINE extra klasse dafür zu machen

1. entweder anonyme klasse
2. anonyme methode
3. einee methode übergeben
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Exelsior JavaFX Taschenrechner mit FX AWT, Swing, JavaFX & SWT 6
melaniemueller Taschenrechner JavaFX AWT, Swing, JavaFX & SWT 4
N JavaFX Einfacher Taschenrechner mit Scene Builder und Java FX AWT, Swing, JavaFX & SWT 0
melaniemueller JavaFX Taschenrechner mit SceneBuilder AWT, Swing, JavaFX & SWT 12
K JavaFX Taschenrechner textField auf 10stellen begrenzen AWT, Swing, JavaFX & SWT 26
L JavaFX javafx.fxml.LoadException bei einem Taschenrechner AWT, Swing, JavaFX & SWT 5
N Swing Taschenrechner GUI AWT, Swing, JavaFX & SWT 13
B Probleme Action Listener Taschenrechner AWT, Swing, JavaFX & SWT 27
O JavaFX mini Taschenrechner! AWT, Swing, JavaFX & SWT 35
N Taschenrechner mit mehreren Rechnungen AWT, Swing, JavaFX & SWT 18
A JavaFX Sehr viele Exceptions bei Taschenrechner mit JavaFx AWT, Swing, JavaFX & SWT 2
K Taschenrechner mit GUI AWT, Swing, JavaFX & SWT 2
L Event Handling Gui für Taschenrechner AWT, Swing, JavaFX & SWT 27
H Swing Taschenrechner GUI AWT, Swing, JavaFX & SWT 5
M Taschenrechner AWT, Swing, JavaFX & SWT 21
T Swing Taschenrechner AWT, Swing, JavaFX & SWT 2
M AWT Java-Taschenrechner, wie Stack richtig verwenden? AWT, Swing, JavaFX & SWT 14
C Grafik Taschenrechner AWT, Swing, JavaFX & SWT 5
H Taschenrechner Coding Erklärung AWT, Swing, JavaFX & SWT 2
Jats Hilfe bei FocusListener für Taschenrechner AWT, Swing, JavaFX & SWT 4
B Taschenrechner mit ComboBox AWT, Swing, JavaFX & SWT 7
S AWT Probleme mit Taschenrechner AWT, Swing, JavaFX & SWT 9
V Bitte um Hilfe bei nem Taschenrechner AWT, Swing, JavaFX & SWT 8
C Taschenrechner in Java AWT, Swing, JavaFX & SWT 7
M MouseEvent JButton Taschenrechner AWT, Swing, JavaFX & SWT 5
K Java-Taschenrechner AWT, Swing, JavaFX & SWT 1
L Taschenrechner mit Klammern AWT, Swing, JavaFX & SWT 11
H Taschenrechner AWT, Swing, JavaFX & SWT 5
G Taschenrechner-Problem AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben