Methoden Action Event wird nicht vollständig ausgeführt

Eduard95

Neues Mitglied
Ich möchte eine Gui programmieren welche zuerst lediglich zwei Buttons beinhaltet. Abhängig davon welchen Button der Benutzer drückt sollen die entsprechenden weiteren Gui Elemente dem Hauptfenster "frame" hinzugefügt werden.
Problem: Wird button1 gedrückt sollte ein neuer Button auf der Gui erscheinen. Der Code im zugehörigen ActionEvent wird aber scheinbar nur bis zur Konsolenausgabe ausgeführt.
Drücke ich zuerst button1 und anschließend button2 so erscheint der neue Button doch noch auf dem Hauptfenster.
Kann mir jemand diesen Zusammenhang erklären ?
Wie muss ich den Code ändern damit der neue Button (bzw. das Panel auf dem er angebracht) ist direkt beim ActionEvent von button1 sichtbar wird?

Code:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Stack implements ActionListener{
  

    public static JFrame frame = new JFrame();
    JButton button1;
    JButton button2;
    JPanel buttonPanel;

      
    public Stack() {
        frame.setTitle("The Planner");
        frame.setSize(400, 400);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(null);
              
        button1 = new JButton("Work");
        button1.setBounds(20, 20, 150, 35);
        button1.addActionListener(this);
      
        button2 = new JButton("Holiday");
        button2.setBounds(200, 20, 150, 35);
        button2.addActionListener(this);
              
        buttonPanel = new JPanel();
        buttonPanel.setLayout(null);
        buttonPanel.setBounds(0, 0, 400, 100);
      
        buttonPanel.add(button1);
        buttonPanel.add(button2);
        frame.add(buttonPanel);
  
        frame.setVisible(true);
    }


    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == button1) {
            System.out.println("Button1 is pressed");

            JPanel overlayPanel = new JPanel();
            overlayPanel.setLayout(new GridLayout());
          
            JButton zuss = new JButton("Open Outlook");
            overlayPanel.add(zuss);
            overlayPanel.setBounds(0, 200, 380, 30);
            frame.add(overlayPanel);
          
            //frame.setVisible(true);
          
        } else if(e.getSource() == button2) {
            System.out.println("Button2 is pressed");
          
            Stack program2 = new Stack();
        }
    }
  
  
    public static void main(String[] args) {
        Stack startProgram = new Stack();       
    }   
}
 
Wenn du einem bereits sichtbaren Fenster etwas hinzu fügst, dann musst Du dem Fenster mindestens sagen, dass es sich neu zeichnen soll (repaint() Aufruf).
Wenn auch noch Positionierung und so berechnet werden muss, dann sollte vor dem repaint noch ein revalidate() Aufruf erfolgen.
 
Wenn du einem bereits sichtbaren Fenster etwas hinzu fügst, dann musst Du dem Fenster mindestens sagen, dass es sich neu zeichnen soll (repaint() Aufruf).
Wenn auch noch Positionierung und so berechnet werden muss, dann sollte vor dem repaint noch ein revalidate() Aufruf erfolgen.


Vielen Dank, das funktioniert!! 😀
Wobei mir der Zusammenhang immer noch nicht klar ist warum sich der Frame bei button2 aktualisiert .. egal.
 
Wenn ich das richtig sehe, erstellst Du ein neues Fenster. Dieses verdeckt das alte (teilweise). Wenn Du das neue Fenster verschiebst / klein machst, muss das alte Fenster neu gezeichnet werden. (Als eine Möglichkeit. Das Fenster bekommt aus irgend einem Grund vom Betriebssystem gesagt: mal dich neu!

Ebenso könntest Du nach dem Button1 einfach das Fenster minimieren und wieder her stellen. Dann würde das Betriebssystem dem Fenster auch sagen, dass es sich neu malen soll.
 

Zurück
Oben