繁体   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