Abbrechen muss immer einmal mehr gedrückt werden

Jinairu

Mitglied
Moin Moin, ich habe einen Fehler in dem untenstehenden Interface.
Das Problem ist, an sich funktioniert das so, wie ich es mir vorstelle.
Es ist ein Programm um Zinsen eines Kredites zu berechnen.
Zuerst wird ausgewählt, was übergeben wird, z.B. Gesamtaufnahme, Zinssatz und die Laufzeit.
Danach kann werden die einzelnen Buttons zu eingabe Buttons und es öffnet sich ein InputDialog.
Danach wird mit ParseInt geprüft, ob nur Zahlen eingegeben wurden und zuletzt wird die zahl zurückgegeben um mit ihr zu arbeiten.
Problem ist, es wird jedes mal einmal mehr das Fenster zur Eingabe aufgerufen.
Ob ich abbrechen drücke oder eine Zahl eingebe ist dabei egal.
Ich habe auch schon mit verschiedenen ActionListenern gearbeitet, hab aber trotzdem nicht geholfen.

Kann mir jemand sagen, wo genau der Fehler liegt? Von dem mir gegebenen Verständnis her, müsste doch der ActionListener bzw das ActionEvent nur einmal aufgerufen werden.
Gibt es dazu eine passende methode um den irgendwie zu "resetten" oder das sonstwie zu verhindern?

Java:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
 
public class UIKern {
 
    private JFrame frame = new JFrame();
    private JPanel panel = new JPanel();
    private JButton button1 = new JButton();
    private JButton button2 = new JButton();
    private JButton button3 = new JButton();
    private JButton referenz = new JButton();
    private ActionListener action = new ActionListener() {
 
        @Override
        public void actionPerformed(ActionEvent arg0) {
            ((JButton) arg0.getSource()).setEnabled(false);
            referenz = ((JButton) arg0.getSource());
            eingabe();
        }
    };
 
    void start() {
        frame.setSize(600, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel.setSize(600, 400);
        panel.setLayout(null);
        panel.setBackground(Color.BLUE);
        ersteAuswahl();
        frame.add(panel);
        frame.setVisible(true);
    }
 
    void buttonAnzeigen() {
        button1.setBounds(50, 50, 100, 20);
        button1.addActionListener(action);
        button2.setBounds(50, 80, 100, 20);
        button2.addActionListener(action);
        button3.setBounds(50, 110, 100, 20);
        button3.addActionListener(action);
        panel.add(button1);
        panel.add(button2);
        panel.add(button3);
    }
 
    float eingabe() {
        float floatTemp = 0;
        String stringTemp;
        while (true) {
            stringTemp = JOptionPane.showInputDialog("Bitte nur Zahlen eingeben:");
            if (stringTemp == null) {
                referenz.setEnabled(true);
                break;
            } else {
                try {
                    floatTemp = Float.parseFloat(stringTemp);
                    break;
                } catch (Exception e) {
                    JOptionPane.showMessageDialog(null, "Nur Zahlen eingeben", "Fehler!", JOptionPane.OK_CANCEL_OPTION);
                }
            }
        }
        return floatTemp;
    }
 
    void ersteAuswahl() {
        button1.setBounds(200, 50, 200, 30);
        button1.setText("Kapital, Zinsen, Laufzeit");
        button1.addActionListener(new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent arg0) {
                panel.removeAll();
                button1.setText("Kapital");
                button2.setText("Zinsen");
                button3.setText("Laufzeit");
                buttonAnzeigen();
                panel.repaint();
            }
        });
        button2.setBounds(200, 90, 200, 30);
        button2.setText("Kapital, Zinssatz, Dauer");
        button2.addActionListener(new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent arg0) {
                panel.removeAll();
                button1.setText("Kapital");
                button2.setText("Zinssatz");
                button3.setText("Laufzeit");
                buttonAnzeigen();
                panel.repaint();
            }
        });
        button3.setBounds(200, 130, 200, 30);
        button3.setText("Zinsen, Zinssatz, Laufzeit");
        button3.addActionListener(new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent arg0) {
                panel.removeAll();
                button1.setText("Zinsen");
                button2.setText("Zinssatz");
                button3.setText("Laufzeit");
                buttonAnzeigen();
                panel.repaint();
            }
        });
        panel.add(button1);
        panel.add(button2);
        panel.add(button3);
 
    }
}

Vielen Dank und das UI ist nicht immer so spärlich^^ habs nur reduzieren wollen zum fehlersuchen 😛

lg, Jin
 
du bist zu sparsam, du verwendest die Button mehrfach,

wenn die erste Wahl getroffen wird und Kapital/ Zinsen/ Laufzeit ansteht, dann sind die Listener aus ersteAuswahl() immer noch aktiv,
neben Eingabe wird wieder eine Auswahl der Eingabe getroffen, die Beschriftungen der Button können sich ändern,
Code:
buttonAnzeigen();
wird bald mehrfach ausgeführt, entsprechend viele Listener sammeln sich an,
immer derselbe, aber man kann ihn mehrfach registrieren, wird mehrfach ausgeführt

wenn du vorherige Listener mit
Code:
buttonX.removeActionListener(buttonX.getActionListeners()[0]);
entfernst kann das letzlich noch gut gehen, schön ist das aber nicht,

unterscheide doch wenigstens zwischen den drei am Anfang + drei zur Eingabe,
für letztere drei die Initialisierung von setBounds() und addActionListener() nur einmal am Anfang,

Text zu ändern und zum Panel hinzufügen ist weniger gefährlich,
(setBounds() macht auch keine Probleme, aber einmal reicht völlig)
 

Zurück
Oben