Swing应用程序冻结

时间:2015-11-09 19:22:54

标签: java swing awt

我对AWT / Swing编程很新,所以我没有看到问题。 调用该事件时,即使在删除组件之前,窗口也会冻结,我必须手动关闭它。

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

@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]);
        }
    }   
}

这是main(String [] args)类:

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类:

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();
    }
}
}

最后在Intro课程中:

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);
}

1 个答案:

答案 0 :(得分:1)

我明白了:

@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()解决了它。