我对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);
}
答案 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()解决了它。