【发布时间】:2012-08-20 17:13:15
【问题描述】:
我有以下代码:
ActionListener listenerComboVehicle = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
comboVehicle.removeActionListener(listenerComboVehicle);
frameCrewSelection.removeAll();
frameCrewSelection.add(formCrewSelectionForm(SpaceObjectArray.findMannedByName(comboVehicle.getSelectedItem().toString()))); //Create some controls (Jcombobox comboVehicle included) and assign listeners to them.
formComboCrews(); //Modify JCombobox controls content
}
};
我的应用程序挂在EventDispatchThread.java 中的以下代码:
void pumpEventsForFilter(int id, Conditional cond, EventFilter filter) {
addEventFilter(filter);
while (doDispatch && cond.evaluate()) {
if (isInterrupted() || !pumpOneEventForFilters(id)) {
doDispatch = false;
}
}
removeEventFilter(filter);
}
while 循环是无限的,它会挂起我的应用程序。当.removeAll() 不存在时,应用程序不会挂起,但我会在旧控件上获得新控件。我通过布置一个框架并再次创建它找到了一种解决方法,但它看起来很讨厌。如果需要,将提供其他代码。请帮忙。
【问题讨论】:
-
我想知道您的
removeAll()是否删除了 JFrame 的 JRootPane、GlassPane 和 contentPane。为什么不使用 CardLayout 交换视图而不是手动添加和删除组件?另外,这个 JFrame 应该改为 JDialog 吗? -
我尝试过 .setContentPane 而不是删除/添加,它的行为相同。添加组件是有原因的——comboVehicle 组合框的每个元素都应该有不同数量的控件。是的,将来有时最好是 JDialog。
-
感谢 CardLayout。这很有趣,但我认为它并不完美。
-
我在 Java 7 中遇到了一个问题,在框架上调用
removeAll会导致严重的重绘问题(听起来正是 HoverCraftFullOfEels 所描述的)。您是否尝试过frameCrewSelection.getContentPane().removeAll()?我还会系统地注释掉以下两行(在removeAll之后),看看这是否有所不同,可能会突出另一个问题 -
我认为 JFrame.removeAll() 也可以删除 Java6 中的 RootPane....
标签: java swing concurrency jframe event-dispatch-thread