Swing 应用程序冻结

Swing application freezes

我是 AWT/Swing 编程的新手,所以我看不出问题所在。 调用事件时,window 甚至在删除组件之前就冻结了,我必须手动将其关闭。

那么,这段代码有什么问题?

@Override
public void actionPerformed(ActionEvent event) 
{
    if(((JButton)event.getSource()).getName() == "start")
    {
        for(Component c : QuizShow.frame.getContentPane().getComponents())
        {
            if(c.getName() == "wrapper")
            {
                final JPanel wrapper = (JPanel) c;

                SwingUtilities.invokeLater
                (
                    new Runnable()
                    {
                        public void run() {
                                wrapper.removeAll();
                                QuizPanel qp = new MainQuizPanel();
                                qp.setup();
                                wrapper.add(qp);
                        }
                    }
                );

                break;
            }
        }
    }

    System.out.println(event.getSource());      
}

编辑: 这是 qp.setup() void:

public void setup()
{
    for(int i = 0; i < 6; i++)
    {
        for(int j = 0; j < 6; j++)
        {
            questions[i*6+j] = new JButton();
            questions[i*6+j].setText(""+i*10);;
            add(questions[i*6+j]);
        }
    }   
}

这是主要的(String[] args) class:

SwingUtilities.invokeLater
    (
        new Runnable()
        {
            public void run() {
                frame = new QuizShowFrame("Quiz Show");
                frame.setSize(800, 600);
                frame.setResizable(false);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocation(100, 100);
                frame.setVisible(true);
            }               
        }
    );  

还有 QuizShowFrame class:

public class QuizShowFrame extends JFrame
{
private static final long serialVersionUID = 1L;

public QuizPanel introPanel = new Intro();

public JPanel p = new JPanel();

public QuizShowFrame(String name) 
{
    super(name);

    this.setLayout(new BorderLayout());

    Container c = this.getContentPane();

    p.setBorder(new EmptyBorder(5,5,5,5));
    p.setName("wrapper");
    p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
    c.add(p);

    p.add(introPanel);

    try
    {
        introPanel.setup();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}
}

最后在简介中 class:

public void setup()
{
    //...skipped JTextPanes...

    JButton gameStart = new JButton("Start the quiz show");
    gameStart.setName("start");

    try {
        gameStart.addActionListener(Listener.class.newInstance());
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

    add(gameStart);
}

我知道了:

@Override
public void actionPerformed(final ActionEvent e) 
{
    if(((JButton)e.getSource()).getName().equals("start"))
    {
        for(final Component c : QuizShow.frame.getContentPane().getComponents())
        {
            if(c.getName().equals("wrapper"))
            {
                ((JPanel) c).removeAll();
                c.repaint();
                QuizPanel qp = new MainQuizPanel();
                ((JPanel) c).add(qp);
                qp.setup();
                c.validate();

                break;
            }
        }
    }           
}

This helped me. 似乎 .validate() 解决了它。