如何从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

回到顶部