如何从JFrame删除JPanel?
当我需要时会出现一个新的JPanel(超过了时间限制或用户按下了“提交”按钮)。但是几秒钟后,旧的JPanel的某些元素就会与新的JPanel的组件一起出现。我不明白为什么会这样。
我以为是因为我必须对其他线程更新窗口。但是第一个线程只需将旧面板添加一次(因此,应该完成)。在第二个线程中,我有一个中断的循环(因此,它也应该完成)。
这是我的代码:
private Thread controller = new Thread() { public void run() {
// First we set the initial pane (for the selection of partner).
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.getContentPane().add(generatePartnerSelectionPanel());
frame.invalidate();
frame.validate();
}
});
// Update the pane for the selection of the parnter.
for (int i=40; i>0; i=i-1) {
final int sec = i;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
timeLeftLabel.setText(sec + " seconds left.");
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) { }
if (partnerSubmitted) {
break;
}
}
// For the given user the selection phase is finished (either the time is over or form was submitted).
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.getContentPane().add(generateWaitForGamePanel());
frame.invalidate();
frame.validate();
}
});
}
};
回答:
从容器(框架)中删除组件(面板)的最简单方法是保留对其的引用,然后调用Container.remove(Component)
ie:
private Thread controller = new Thread() {public void run() {
final Component panel1 = generatePartnerSelectionPanel();
// First we set the initial pane (for the selection of partner).
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.getContentPane().add(panel1);
frame.invalidate();
frame.validate();
}
});
// Update the pane for the selection of the parnter.
for (int i=40; i>0; i=i-1) {
final int sec = i;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
timeLeftLabel.setText(sec + " seconds left.");
}
});
try {Thread.sleep(1000);} catch (InterruptedException e) {}
if (partnerSubmitted) {break;}
}
// For the given user the selection phase is finished (either the time is over or form was submitted).
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.getContentPane().remove(panel1);
frame.getContentPane().add(generateWaitForGamePanel());
frame.invalidate();
frame.validate();
}
});
}
};
我没有测试此代码,但它应该可以工作。
以上是 如何从JFrame删除JPanel? 的全部内容, 来源链接: utcz.com/qa/408996.html