Swing JTabbedPane:addChangeListener或addContainerListener或两者?

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() {

我有一个swing代码是由其他人编写的。对于swing选项卡式窗格,他添加了change和container listener,并且都调用了相同的方法:

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
我想知道,这种代码是否会引起一些问题。 最近,我们面临随机IndexOutOfBoundException例外。我是 只是想知道,这是否导致了这个问题

由于示例代码中没有一行可以抛出该异常,因此不可能回答您的问题。发表一篇文章,说明你的问题

根据我在swing中的理解,一旦听到事件,逻辑 内部应使用辅助线程(例如SwingWorker)执行。 请让我知道这是否正确

这取决于:

  • 如果您需要修改UI中的任何内容,任何与Swing相关的内容,都需要在EDT(事件调度线程)上执行,因此,
    SwingWorker
    不是一个选项
  • 如果您需要执行业务逻辑操作,特别是如果它们可能很长,那么您确实应该使用
    SwingWorker
    或任何其他机制在EDT之外的其他线程中执行该代码。考虑访问<代码> Swing <代码>标签wiki,关于“并发”