我有一个由其他人写的挥杆代码。对于swing选项卡式窗格,他添加了更改和容器侦听器,并且两者都调用相同的方法:
addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent theEvent ) {
someMethod();
}
} );
addContainerListener(new ContainerAdapter() {
public void componentAdded(ContainerEvent theEvent) {
someMethod();
}
public void componentRemoved(ContainerEvent theEvent) {
someMethod();
}
} );
每当从此选项卡式窗格中删除选项卡时,它会在内部调用JTabbedPane.removeTabAt(int index),后者又调用fireStateChanged(),从而导致更改侦听器侦听新的更改事件。 现在,当从选项卡式窗格中删除新组件(选项卡)时,它还会调用容器侦听器的componentRemoved(ContainerEvent theEvent)方法。
更改均匀和容器事件,然后调用相同的方法someMethod(),它设置背景和前景色。
我想知道,如果这种代码可能会导致一些问题。最近我们面临随机的IndexOutOfBoundException exeptions。我只是想知道,如果这导致了这个问题。
另外根据我在swing中的理解,一旦听到事件,其中的逻辑应该使用工作线程(例如SwingWorker)执行。如果这是正确的,请告诉我。
我是新手,因此任何提示都会受到赞赏。 感谢。
答案 0 :(得分:1)
每当从此选项卡式窗格中删除选项卡时,它都会在内部调用 JTabbedPane.removeTabAt(int index),后者又调用 fireStateChanged()导致更改侦听的新更改事件 监听器。
如果删除的选项卡也是选定的选项卡,则为true。在其他情况下,您将不会收到通知。
您需要选择要收听的内容:
ContainerListener
ChangeListener
我想知道,如果这种代码可能会导致一些问题。 最近我们面临随机的IndexOutOfBoundException exeptions。我是 只是想知道,如果这导致了这个问题。
由于示例代码中没有可能引发该异常的行,因此无法回答您的问题。发布显示您问题的SSCCE。
另外根据我在摇摆中的理解,一旦听到了事件,逻辑 它应该使用工作线程(例如SwingWorker)执行。 如果这是正确的,请告诉我。
取决于:
SwingWorker
不是一个选项。SwingWorker
或任何其他机制在除EDT之外的另一个线程中执行该代码。考虑访问“并发”Swing
标记wiki