0

他の人が書いた Swing コードが 1 つあります。スイング タブ付きペインの場合、彼は変更リスナーとコンテナー リスナーの両方を追加し、両方が同じメソッドを呼び出します。

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 に答える