JButton wird nicht in meinem JFrame gemalt. JFrame befindet sich in while-Schleife

  • Ich versuche, eine Art Wackelspiel zu erstellen, und ich habe einen JFrame in der while-Schleife, so dass er jede Sekunde einen JFrame an einem neuen Ort erstellt Laden Sie während dieses Prozesses. Hier ist mein Code:

     import java.util.*;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    public class WACKAMOLE {
    private static JFrame frame;
    private static JFrame frame1;
    private static JButton button1;
    private static int a;
    private static int b;
    private static int x = 0;
    private static int score=0;
    
        public static void main(String args[]){
        Menu n=new Menu();
        n.Start();
    
    }
    
    static class Menu{
    
           public void Start(){
        frame=new JFrame();
        frame.setSize(150, 150);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        JPanel panel=new JPanel();
        JLabel label=new JLabel("Main Menu");
        JLabel label1=new JLabel("WACK A MOLE DELUXE");
        JButton button=new JButton("Start");
        JButton button1=new JButton("Highscores");
        panel.add(label1);
        panel.add(label);
        panel.add(button);
        panel.add(button1);
        frame.add(panel);
        frame.setVisible(true);
        button.addActionListener(new game());
        }
    }
    
    static class game implements ActionListener{
        public void actionPerformed(ActionEvent e){
            frame.dispose();
            Random generator=new Random();
            Random generator1=new Random();
            while(x<=30){
            a=generator.nextInt(1000);
            b=generator1.nextInt(1000);
            frame1=new JFrame("HEHE");
            frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame1.setSize(100,100);
            frame1.setLocation(a,b);
            frame1.setResizable(false);
            button1=new JButton("WACK ME!");
            button1.addActionListener(new clicked());
            frame1.setVisible(true);
            frame1.add(button1);
            frame1.setVisible(true);
    
            try{Thread.sleep(900);}
            catch(Exception e1){System.out.println("ERROR");}
    
            frame1.dispose();
            x++;
            }
    
        }
    
        static class clicked implements ActionListener{
            public void actionPerformed(ActionEvent e){
                frame1.dispose();
                x++;
                score++;
    
            }
        }
    
    }
    
     }
     
    22 November 2011
    mre한재진
1 answer
  • Wenn Sie den Event-Dispatch-Thread in den Ruhezustand versetzen, werden alle GUI-Events und -Anstriche blockiert. Sie müssen einen Hintergrundthread verwenden, um den Ruhezustand zu aktivieren, und dann die Beseitigung des Frames im EDT aus dem Hintergrundthread auslösen.

    Lesen Sie die Tutorial zur Parallelität in Swing .

    22 November 2011
    JB Nizet