Swing JTabbedPane:addChangeListener或addContainerListener或两者兼而有之?

时间:2013-08-13 09:44:12

标签: swing exception listener jtabbedpane swingworker

我有一个由其他人写的挥杆代码。对于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)执行。如果这是正确的,请告诉我。

我是新手,因此任何提示都会受到赞赏。 感谢。

1 个答案:

答案 0 :(得分:1)

  

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

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

您需要选择要收听的内容:

  • 添加/去除组分? - >去ContainerListener
  • 所选标签? - >去ChangeListener
  

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

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

  

另外根据我在摇摆中的理解,一旦听到了事件,逻辑   它应该使用工作线程(例如SwingWorker)执行。   如果这是正确的,请告诉我。

取决于:

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