簡體   English   中英

Java Swing - 知道是否已在ChangeListener中刪除/添加了選項卡

[英]Java Swing - Knowing if tab has been removed/added in ChangeListener

假設我有一個帶有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現在應該被解雇了,有沒有辦法在監聽器中確定是否由於選項卡刪除/添加而被調用?

編輯:我基本上只是在用戶在選項卡之間切換而不是在添加或刪除時才嘗試執行某些操作。

如果我沒有記錯,JTabbedPane的將觸發一個componentAdded()事件(在容器中定義)時增加了一個新的選項卡和componentRemoved()如果標簽被刪除事件。

您應該能夠通過注冊ContainerListener來監聽添加或刪除選項卡

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

stateChanged()事件只是add的副作用,因為JTabbedPanel會自動切換到新選項卡。

您可能還想檢查由removeTabAt()設置的客戶端屬性__index_to_remove__

根據具體要求,您可能會跟蹤所選組件,只有在更改時才會執行操作:

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);

但是,可能還不夠好,因為如果刪除了選定的選項卡本身,它將觸發。

通過跟蹤當前的選項卡數量,您可以根據添加或刪除檢測選擇更改

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM