4

ChangeListenerを備えたJTabbedPaneがあるとしましょう

JTabbedPane tabbedPane = new JTabbedPane();

// Add few tabs
.....
.....

tabbedPane.addChangeListener(new ChangeListener() {
  public void stateChanged(ChangeEvent changeEvent) {
    // How to determine if the changeEvent was fired because of a tab remove/add ?
  }
});

そしてどこかで私は

tabbedPane.removeTabAt(2);

そしてどこか他の場所

tabbedPane.add(panel, 0);

ChangeListenerは今すぐ起動されるはずですが、タブの削除/追加が原因で呼び出されたかどうかをリスナー内で判断する方法はありますか?

編集:私は基本的に、ユーザーがタブを切り替えたときにのみいくつかのアクションを実行しようとしていますが、追加または削除するときは実行していません。

4

4 に答える 4

7

私の記憶が正しければ、JTabbedPaneはcomponentAdded()、新しいタブが追加されたときにイベント(Containerで定義)を発生させcomponentRemoved()、タブが削除されたときにイベントを発生させます。

ContainerListenerを登録することで、タブの追加または削除をリッスンできるはずです。

http://docs.oracle.com/javase/7/docs/api/java/awt/Container.html#addContainerListener(java.awt.event.ContainerListener)

JTabbedPanelが自動的に新しいタブに切り替わるため、このstateChanged()イベントは追加の副作用にすぎません。

于 2012-08-20T11:10:09.430 に答える
2

__index_to_remove__によって設定されるクライアントプロパティを調べることもできますremoveTabAt()

于 2012-08-20T11:18:27.050 に答える
2

正確な要件に応じて、選択したコンポーネントを追跡し、それが変更された場合にのみ処理を行う場合があります。

ChangeListener l = new ChangeListener() {

    Component lastSelected = tabbedPane.getSelectedComponent();
    @Override
    public void stateChanged(ChangeEvent e) {
        if (lastSelected != tabbedPane.getSelectedComponent()) {
            LOG.info("changed: " + tabbedPane.getSelectedIndex());
            lastSelected = tabbedPane.getSelectedComponent();
        }

    }
};
tabbedPane.addChangeListener(l);

ただし、選択したタブ自体が削除されるとトリガーされるため、十分ではない可能性があります。

于 2012-08-20T11:51:32.997 に答える
0

現在のタブ数を追跡することで、追加または削除に基づいて選択の変更を検出できます

ChangeListener l = new ChangeListener() {

    int lastTabCount = tabbedPane.getTabCount();
    Component lastSelected = tabbedPane.getSelectedComponent();

    @Override
    public void stateChanged(ChangeEvent e) {
        if (lastSelected != tabbedPane.getSelectedIndex())
        {
            int currentTabCount = tabbedPane.getTabCount();
            if (lastTabCount == currentTabCount ) {
                LOG.info("changed: " + tabbedPane.getSelectedIndex());
            } else if (lastTabCount < currentTabCount)
                LOG.info("changed due to delete: " + tabbedPane.getSelectedIndex());
            } else if (lastTabCount > currentTabCount)
                LOG.info("changed due to add: " + tabbedPane.getSelectedIndex());
            }
            lastTabCount = tabbedPane.getTabCount();
            lastSelected = tabbedPane.getSelectedComponent();
        }

    }
};
tabbedPane.addChangeListener(l);
于 2014-01-07T22:00:51.050 に答える