0

我有一个由其他人编写的摇摆代码。对于 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 异常。我只是想知道,如果这导致了这个问题。

同样根据我对swing的理解,一旦事件被监听,它内部的逻辑应该使用工作线程(例如SwingWorker)来执行。请让我知道这是否正确。

我是摇摆新手,因此任何提示将不胜感激。谢谢。

4

1 回答 1

1

每当从该选项卡式窗格中删除选项卡时,它会在内部调用 JTabbedPane.removeTabAt(int index),然后调用 fireStateChanged() 导致更改侦听器侦听新的更改事件。

如果删除的选项卡也是选定的选项卡,则这是真的。在其他情况下,您不会收到通知。

您需要选择要收听的事件:

  • 添加/删除组件?--> 去ContainerListener
  • 选择标签?--> 去ChangeListener

我想知道,如果这种代码可能会导致一些问题。最近我们面临着随机的 IndexOutOfBoundException 异常。我只是想知道,如果这导致了这个问题。

由于您的示例代码中没有任何行可能引发该异常,因此无法回答您的问题。发布显示您的问题的SSCCE 。

同样根据我对swing的理解,一旦事件被监听,它内部的逻辑应该使用工作线程(例如SwingWorker)来执行。请让我知道这是否正确。

这取决于:

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