Swing JTabbedPane:addChangeListener或addContainerListener或两者?
我有一个swing代码是由其他人编写的。对于swing选项卡式窗格,他添加了change和container listener,并且都调用了相同的方法:Swing JTabbedPane:addChangeListener或addContainerListener或两者?,swing,exception,listener,jtabbedpane,swingworker,Swing,Exception,Listener,Jtabbedpane,Swingworker,我有一个swing代码是由其他人编写的。对于swing选项卡式窗格,他添加了change和container listener,并且都调用了相同的方法: addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent theEvent ) { someMethod(); } } ); addContainerListener(new ContainerAdapter() {
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例外。我只是想知道,这是否导致了这个问题
另外,根据我在swing中的理解,一旦事件被监听,它内部的逻辑应该使用工作线程(例如SwingWorker)执行。请让我知道这是否正确
我对swing是新手,因此任何提示都将不胜感激。
谢谢
每当从此选项卡式窗格中删除选项卡时,它都会在内部调用
removeTabAt(int index),它依次调用
fireStateChanged()导致change侦听的新更改事件
听众
如果删除的选项卡也是选定的选项卡,则为真。在其他情况下,不会通知您
您需要选择要收听的活动:
- 添加/删除组件?-->选择
ContainerListener
- 所选选项卡?-->转到
ChangeListener
- 如果您需要修改UI中的任何内容,任何与Swing相关的内容,都需要在EDT(事件调度线程)上执行,因此,
不是一个选项SwingWorker
- 如果您需要执行业务逻辑操作,特别是如果它们可能很长,那么您确实应该使用
或任何其他机制在EDT之外的其他线程中执行该代码。考虑访问<代码> Swing <代码>标签wiki,关于“并发”SwingWorker