Swing ActionListener führt seine Aufgabe nur teilweise aus.

  • Themenstarter Themenstarter lucas8995
  • Beginndatum Beginndatum
L

lucas8995

Gast
Hallo liebes Forum 🙂

Bin gerade dabei mit BlueJ ein GUI zu programmieren, allerdings führt der ActionListener seine Aufgaben nur teilweise aus. JTextFields werden nicht angezeigt, oder wenn sie removed werden sollen, bleiben sie trotzdem da. Weiterhin werden die eingegebenen Werte nicht übertragen. Ich finde meinen Fehler nicht, werd schon ganz bekloppt. Das Programm soll ganz einfach nur Umfang und Flächeninhalt vom Quadrat, Rechteck, Dreieck und Kreis ausrechnen. Für Jede Figur habe ich eine eigene Klasse erstellt.

Hier der Quellcode der Klasse, in der das GUI programmiert ist:
Java:
import java.awt.Font;
import javax.swing.*;
import java.awt.event.*;

public class StartGUI extends JFrame{
    JLabel text;
    JLabel text_fD;
    JLabel text_fQ;
    JLabel text_fR;
    JLabel text_fK;
    JLabel text_uK;
    JLabel text_uR;
    JLabel text_uQ;
    JLabel text_uD;
    JLabel text_kD;

    JButton buttonQ;
    JButton buttonR;
    JButton buttonD;
    JButton buttonK;
    JButton buttonBD;
    JButton buttonBQ;
    JButton buttonBR;
    JButton buttonBK;

    JTextField eingabe_d1;
    JTextField eingabe_d2;
    JTextField eingabe_d3;
    JTextField eingabe_q;
    JTextField eingabe_r1;
    JTextField eingabe_r2;
    JTextField eingabe_k;

    Dreieck d;
    Quadrat q;
    Rechteck r;
    Kreis k;

    public StartGUI()
    {
        super("Elementarisch Geometrische Groessen");
        setSize(500,300);
        setVisible(true);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLayout(null);
        setAlwaysOnTop(true);
        oberflaeche();
    }

    public void oberflaeche()
    {
        text = new JLabel("Bitte waehlen Sie eine Figur und geben die erforderlichen Werte in cm ein.");
        text.setBounds(10, 0,500, 50);
        Font schriftart = (text.getFont().deriveFont(Font.BOLD + Font.ITALIC, 12));
        text.setFont(schriftart);
        text.setVisible(true);
        add(text);

        startGUIButton();

    } 

    public void startGUIButton()
    {
        buttonQ = new JButton("Quadrat");  
        buttonQ.setBounds(25, 175, 200, 25);
        add(buttonQ);
        buttonQ.addActionListener(new AListener());

        buttonR = new JButton("Rechteck");
        buttonR.setBounds(275, 175, 200, 25);        
        add(buttonR);

        buttonD = new JButton("Dreieck");
        buttonD.setBounds(25, 225, 200, 25);        
        add(buttonD);
        buttonD.addActionListener(new AListener());

        buttonK = new JButton("Kreis");
        buttonK.setBounds(275, 225, 200, 25);
        add(buttonK);

        buttonBD = new JButton("Berechne");
        buttonBD.setBounds(25, 275, 450, 25);
        buttonBD.setVisible(false);        
        buttonBD.addActionListener(new AListener());  

        buttonBQ = new JButton ("Berechne");
        buttonBQ.setBounds(25, 275, 450, 25);
        buttonBQ.setVisible(false);        
        buttonBQ.addActionListener(new AListener());  

        buttonBK = new JButton ("Berechne");
        buttonBK.setBounds(25, 275, 450, 25);
        buttonBK.setVisible(false);        
        buttonBK.addActionListener(new AListener());  

        buttonBR = new JButton ("Berechne");
        buttonBR.setBounds(25, 275, 450, 25);
        buttonBR.setVisible(false);        
        buttonBR.addActionListener(new AListener());  
    }

    public void leeren()
    {
        remove(eingabe_q); 
        remove(eingabe_d1); 
        remove(eingabe_d2); 
        remove(eingabe_d3); 
        remove(eingabe_r1); 
        remove(eingabe_r2); 
        remove(eingabe_k); 
    }
    public class AListener implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            if (e.getSource() == buttonD)
            {
                leeren();
                setSize(500, 350);

                buttonBD.setVisible(true);
                add(buttonBD);

                text.setLocation(100,0);
                text.setText("Bitte die Laengen der Seiten a,b und c in cm eingeben.");

                eingabe_d1 = new JTextField();
                eingabe_d1.setBounds(200,50,100,25);
                eingabe_d1.setVisible(true);
                add(eingabe_d1);

                eingabe_d2 = new JTextField();
                eingabe_d2.setBounds(200,85,100,25);
                eingabe_d2.setVisible(true);
                add(eingabe_d2);                      

                eingabe_d3 = new JTextField();
                eingabe_d3.setBounds(200,120,100,25);
                eingabe_d3.setVisible(true);
                add(eingabe_d3);    

            }
            else if (e.getSource() == buttonBD)
            {

                d = new Dreieck();
                d.set_seitenlaenge_a(Double.parseDouble(eingabe_d1.getText()));
                d.set_seitenlaenge_b(Double.parseDouble(eingabe_d2.getText()));
                d.set_seitenlaenge_c(Double.parseDouble(eingabe_d3.getText()));

                text_fD = new JLabel("Flaecheninhalt: "+d.get_flaecheninhalt()+"cm²");
                text_uD = new JLabel("Umfang: "+d.get_umfang()+"cm");
                text_kD = new JLabel("Konstruirbar? "+d.get_konstruirbarkeit());

                text_fD.setBounds(350,50,30,25);
                add(text_fD);

            }

            else if (e.getSource() == buttonQ)
            {
                leeren();
                setSize(500, 350);
                buttonBK.setVisible(true);
                add(buttonBK);

                text.setLocation(100,0);
                text.setText("Bitte die Laenge der Seiten in cm eingeben.");

                eingabe_q = new JTextField();
                eingabe_q.setBounds(200,50,100,25);
                eingabe_q.setVisible(true);
                add(eingabe_q);
            }

            else if (e.getSource() == buttonBQ)
            {

                q = new Quadrat ();
                q.set_seitenlaenge(Double.parseDouble(eingabe_q.getText()));  
                remove(eingabe_q);
                text_fQ = new JLabel("Flaecheninhalt: "+q.get_flaecheninhalt()+"cm²");
                text_uQ = new JLabel("Umfang: "+q.get_umfang()+"cm");
            }

            else if (e.getSource() == buttonR)
            {
                leeren();
                setSize(500, 350);
                buttonBR.setVisible(true);
                add(buttonBR);

                eingabe_r1 = new JTextField();
                eingabe_r1.setBounds(200,50,100,25);
                eingabe_r1.setVisible(true);
                add(eingabe_r1);

                eingabe_r2 = new JTextField();
                eingabe_r2.setBounds(200,50,100,25);
                eingabe_r2.setVisible(true);
                add(eingabe_r2);
            }

            else if (e.getSource() == buttonBR)            
            {
                r = new Rechteck();
                r.set_seitenlaenge_a(Double.parseDouble(eingabe_r1.getText()));  
                r.set_seitenlaenge_b(Double.parseDouble(eingabe_r2.getText()));  

                text_fR = new JLabel("Flaecheninhalt: "+r.get_flaecheninhalt()+"cm²");
                text_uR = new JLabel("Umfang: "+r.get_umfang()+"cm");

            }
            else if (e.getSource() == buttonK)            
            {
                leeren();
                setSize(500, 350);
                buttonBK.setVisible(true);
                add(buttonBK);

                eingabe_k = new JTextField();
                eingabe_k.setBounds(200,50,100,25);
                eingabe_k.setVisible(true);
                add(eingabe_k);

            }           
            else if (e.getSource() == buttonBK)
            {
                k = new Kreis();
                k.set_radius(Double.parseDouble(eingabe_k.getText()));  
 

                text_fK = new JLabel("Flaecheninhalt: "+k.get_flaecheninhalt()+"cm²");
                text_uK = new JLabel("Umfang: "+k.get_umfang()+"cm");
            }

        }
    }
}

Kurze Erklärung (bin übrigens totaler Anfänger): Wenn das Programm gestartet wird, soll gefragt werden welche Figur man berechnen möchte. Wird der entsprechende Button angeklickt soll ein JTextField für, beispielsweise beim Kreis, den Radius erscheinen. Hat man den Wert eingegeben und klickt auf den JButton "Berechnen" soll rechts neben dem JTextField ein JLabel mit dem Flächeninhalt und Umfang erscheinen.

Hänge jetzt schon einige Tage daran. Es wäre super, wenn mir jemand erklären könnte was ich falsch mache.

Liebe Grüße

// Für Kritik und generell für Verbesserungen am Quellcode bin ich natürlich immer offen!
 
Hallo,

also das erste was mir aufgefallen ist.
Code:
setVisible(true);
vom JFrame sollte erst aufgerufen werden, nachdem alle Komponenten hinzugefügt wurden. In deinem Fall nachdem die Methode
Code:
oberflaeche();
aufgerufen wurde.

Wenn du mithilfe von Buttons zur Laufzeit dein GUI änderst, musst sich dein JFrame die Komponenten neu ausrichten. Somit solltest du nach der Änderung noch
Code:
validate();
aufrufen. Evtl. noch
Code:
repaint();
glaub aber validate() sollte reichen.

Mehr zu dem Thema hier: irgendwo in den FAQ's finde es grade nicht sorry.

Testen konnte ich leider nichts, wäre aber so meine Vermutung.
 
Na wenn das nicht mal eine schnelle Antwort war 🙂 vielen Dank!

Java:
setVisible
habe ich jetzt hinter
Java:
oberflaeche();
gesetzt.
Java:
validate();[code=Java] und
repaint();[/code] habe ich auch hinzugefügt. Macht leider keinen Unterschied. In den FAQ hatte ich schon nachgeschaut, fand aber leider keine Lösung zu meinem Problem.

Hatte vergessen den Action Listener beim Kreis und beim Rechteck du adden. Aber das hat keinen Unterschied gebracht.
Der Quellcode sieht jetzt so aus:
Java:
//import javax.swing.JFrame;
import java.awt.Font;
//import javax.swing.JLabel;
import javax.swing.*;
import java.awt.event.*;

public class StartGUI extends JFrame{
    JLabel text;
    JLabel text_fD;
    JLabel text_fQ;
    JLabel text_fR;
    JLabel text_fK;
    JLabel text_uK;
    JLabel text_uR;
    JLabel text_uQ;
    JLabel text_uD;
    JLabel text_kD;

    JButton buttonQ;
    JButton buttonR;
    JButton buttonD;
    JButton buttonK;
    JButton buttonBD;
    JButton buttonBQ;
    JButton buttonBR;
    JButton buttonBK;

    JTextField eingabe_d1;
    JTextField eingabe_d2;
    JTextField eingabe_d3;
    JTextField eingabe_q;
    JTextField eingabe_r1;
    JTextField eingabe_r2;
    JTextField eingabe_k;

    Dreieck d;
    Quadrat q;
    Rechteck r;
    Kreis k;

    public StartGUI()
    {
        super("Elementarisch Geometrische Groessen");
        setSize(500,300);

        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLayout(null);
        setAlwaysOnTop(true);
        oberflaeche();
        setVisible(true);
    }

    public void oberflaeche()
    {
        text = new JLabel("Bitte waehlen Sie eine Figur und geben die erforderlichen Werte in cm ein.");
        text.setBounds(10, 0,500, 50);
        Font schriftart = (text.getFont().deriveFont(Font.BOLD + Font.ITALIC, 12));
        text.setFont(schriftart);
        text.setVisible(true);
        add(text);

        startGUIButton();
        validate();
        repaint();
    } 

    public void startGUIButton()
    {
        buttonQ = new JButton("Quadrat");  
        buttonQ.setBounds(25, 175, 200, 25);
        add(buttonQ);
        buttonQ.addActionListener(new AListener());

        buttonR = new JButton("Rechteck");
        buttonR.setBounds(275, 175, 200, 25);        
        add(buttonR);
        buttonR.addActionListener(new AListener());  

        buttonD = new JButton("Dreieck");
        buttonD.setBounds(25, 225, 200, 25);        
        add(buttonD);
        buttonD.addActionListener(new AListener());

        buttonK = new JButton("Kreis");
        buttonK.setBounds(275, 225, 200, 25);
        add(buttonK);
        buttonK.addActionListener(new AListener());  

        buttonBD = new JButton("Berechne");
        buttonBD.setBounds(25, 275, 450, 25);
        buttonBD.setVisible(false);        
        buttonBD.addActionListener(new AListener());  

        buttonBQ = new JButton ("Berechne");
        buttonBQ.setBounds(25, 275, 450, 25);
        buttonBQ.setVisible(false);        
        buttonBQ.addActionListener(new AListener());  

        buttonBK = new JButton ("Berechne");
        buttonBK.setBounds(25, 275, 450, 25);
        buttonBK.setVisible(false);        
        buttonBK.addActionListener(new AListener());  

        buttonBR = new JButton ("Berechne");
        buttonBR.setBounds(25, 275, 450, 25);
        buttonBR.setVisible(false);        
        buttonBR.addActionListener(new AListener());  
    }

    public void leeren()
    {
        remove(eingabe_q); 
        remove(eingabe_d1); 
        remove(eingabe_d2); 
        remove(eingabe_d3); 
        remove(eingabe_r1); 
        remove(eingabe_r2); 
        remove(eingabe_k); 
    }
    public class AListener implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            if (e.getSource() == buttonD)
            {
                // leeren();
                setSize(500, 350);

                buttonBD.setVisible(true);
                add(buttonBD);

                text.setLocation(100,0);
                text.setText("Bitte die Laengen der Seiten a,b und c in cm eingeben.");

                eingabe_d1 = new JTextField();
                eingabe_d1.setBounds(200,50,100,25);
                eingabe_d1.setVisible(true);
                add(eingabe_d1);

                eingabe_d2 = new JTextField();
                eingabe_d2.setBounds(200,85,100,25);
                eingabe_d2.setVisible(true);
                add(eingabe_d2);                      

                eingabe_d3 = new JTextField();
                eingabe_d3.setBounds(200,120,100,25);
                eingabe_d3.setVisible(true);
                add(eingabe_d3);   
                validate();
                repaint();

            }
            else if (e.getSource() == buttonBD)
            {

                d = new Dreieck();
                d.set_seitenlaenge_a(Double.parseDouble(eingabe_d1.getText()));
                d.set_seitenlaenge_b(Double.parseDouble(eingabe_d2.getText()));
                d.set_seitenlaenge_c(Double.parseDouble(eingabe_d3.getText()));

                text_fD = new JLabel("Flaecheninhalt: "+d.get_flaecheninhalt()+"cm²");
                text_uD = new JLabel("Umfang: "+d.get_umfang()+"cm");
                text_kD = new JLabel("Konstruirbar? "+d.get_konstruirbarkeit());

                text_fD.setBounds(350,50,30,25);
                add(text_fD);
                validate();
                repaint();
            }

            else if (e.getSource() == buttonQ)
            {
                // leeren();
                setSize(500, 350);
                buttonBK.setVisible(true);
                add(buttonBK);

                text.setLocation(100,0);
                text.setText("Bitte die Laenge der Seiten eingeben.");

                eingabe_q = new JTextField();
                eingabe_q.setBounds(200,50,100,25);
                eingabe_q.setVisible(true);
                add(eingabe_q);
                validate();
                repaint();
            }

            else if (e.getSource() == buttonBQ)
            {

                q = new Quadrat ();
                q.set_seitenlaenge(Double.parseDouble(eingabe_q.getText()));  
                remove(eingabe_q);
                text_fQ = new JLabel("Flaecheninhalt: "+q.get_flaecheninhalt()+"cm²");
                text_uQ = new JLabel("Umfang: "+q.get_umfang()+"cm");

                validate();
                repaint();
            }

            else if (e.getSource() == buttonR)
            {
                //   leeren();
                setSize(500, 350);
                buttonBR.setVisible(true);
                add(buttonBR);

                text.setLocation(100,0);
                text.setText("Bitte die Laenge der Seiten a und b in cm eingeben.");

                eingabe_r1 = new JTextField();
                eingabe_r1.setBounds(200,50,100,25);
                eingabe_r1.setVisible(true);
                add(eingabe_r1);

                eingabe_r2 = new JTextField();
                eingabe_r2.setBounds(200,50,100,25);
                eingabe_r2.setVisible(true);
                add(eingabe_r2);
                validate();
                repaint();
            }

            else if (e.getSource() == buttonBR)            
            {
                r = new Rechteck();
                r.set_seitenlaenge_a(Double.parseDouble(eingabe_r1.getText()));  
                r.set_seitenlaenge_b(Double.parseDouble(eingabe_r2.getText()));  

                text_fR = new JLabel("Flaecheninhalt: "+r.get_flaecheninhalt()+"cm²");
                text_uR = new JLabel("Umfang: "+r.get_umfang()+"cm");
                validate();
                repaint();
            }
            else if (e.getSource() == buttonK)            
            {
                //   leeren();
                setSize(500, 350);
                buttonBK.setVisible(true);
                add(buttonBK);

                text.setLocation(100,0);
                text.setText("Bitte den Radius des Kreises in cm angeben.");

                eingabe_k = new JTextField();
                eingabe_k.setBounds(200,50,100,25);
                eingabe_k.setVisible(true);
                add(eingabe_k);
                validate();
                repaint();
            }           
            else if (e.getSource() == buttonBK)
            {
                k = new Kreis();
                k.set_radius(Double.parseDouble(eingabe_k.getText()));  

                text_fK = new JLabel("Flaecheninhalt: "+k.get_flaecheninhalt()+"cm²");
                text_uK = new JLabel("Umfang: "+k.get_umfang()+"cm");
                validate();
                repaint();
            }

        }
    }
}
 
Java:
setLayout(null);
Wer lernt euch so einen Mist? Das macht dir nur unnötige Arbeit (setBounds) und ist fehleranfällig. Siehe link in Signatur.
 
Ich glaube du hast in einem if-Zweig den falschen Button geaddet:

Java:
else if (e.getSource() == buttonQ)
			{
				//leeren();
				setSize(500, 350);

/*********************************
  * Müsste das nicht buttonBQ sein????
  ***********************************/
				buttonBK.setVisible(true);
				add(buttonBK);
/*****************************************
 *
 */

				text.setLocation(100,0);
				text.setText("Bitte die Laenge der Seiten eingeben.");

				eingabe_q = new JTextField();
				eingabe_q.setBounds(200,50,100,25);
				eingabe_q.setVisible(true);
				add(eingabe_q);
				validate();
				repaint();
			}
 
tatsache :O da hatte meine Konzentration wohl etwas nachgelassen.
Werde es sofort mal verbessern.

Zu
Java:
setLayout(null);
Das werde ich ebenso ändern. Habe mir den Link in der Signatur angeschaut, bzw die Seite.

vielen Dank!
 
Warum auch immer dieser Thread als erledigt markiert ist, durch ein bisschen probieren habe ich heraus gefunden, dass es eigentlich an diesem Teil liegen müsste:

Java:
text_fD = new JLabel("Flaecheninhalt: "+d.get_flaecheninhalt()+"cm²");

Was mich aber wunder ist, dass der Text als Beispiel vom Dreieck: "Bitte die Laengen der Seiten a,b und c in cm eingeben." zum Kreis: "Bitte den Radius des Kreises in cm angeben." wiederum schon geändert wird. Sobald man aber den ActionListener betätigt, indem man auf den Button Berechne klickt, kommt Java mit einem Fehler um die Ecke.
 

Zurück
Oben