Rom*_*man 9 java user-interface swing multithreading
最近我在这里问到如何将新的JPanel添加到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();
}
});
}
};
Run Code Online (Sandbox Code Playgroud)
无论是在可见GUI上添加还是删除组件,都是一样的:
panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();
Run Code Online (Sandbox Code Playgroud)
从容器(框架)中删除组件(面板)的最简单方法是保持对它的引用,然后调用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();
}
});
}
};
Run Code Online (Sandbox Code Playgroud)
我没有测试过这段代码,但它应该可行.
| 归档时间: |
|
| 查看次数: |
65774 次 |
| 最近记录: |