2012-08-20 2 views
4

Скажем, у меня есть JTabbedPane с ChangeListenerJava Swing - Зная, если вкладка была удалена/добавлены в ChangeListener

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, есть ли способ определить внутри слушателя, если он был вызван из-за вкладки remove/add?

EDIT: Я стараюсь выполнять некоторые действия только тогда, когда пользователь переключается между вкладками, а не при добавлении или удалении.

+2

Вы можете уточнить, каким образом действия должны реагировать по-разному. – trashgod

+0

Существует вне поля tabbedPage, который нужно изменить только тогда, когда пользователь переключается между вкладками и изменениями в combobox, в свою очередь, добавляет/удаляет вкладки! – Krishnaraj

+0

hmm ... так что _is_, связанный с компонентом вкладки, то есть комбо необходимо будет обновить, когда выбранная вкладка будет удалена? – kleopatra

ответ

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

не может быть достаточно хорошо, хотя, как это сработает, если выбранная вкладка сам удаляется.

+0

+1 Я не вижу более простого способа. Я замечаю, что 'fireStateChanged()' встречается 'if (index == selected)'. – trashgod

+0

, имеющий флаг для отслеживания всех операций добавления/удаления, кажется единственным надежным способом: (Действительно удивился, что ChangeEvent не имеет информации о состоянии. Это должна быть общая проблема, не так ли? – Krishnaraj

+0

Принимая этот ответ, поскольку это может быть достаточно хорошим для многих ppl – Krishnaraj

7

Если я правильно помню, JTabbedPane запускает событие componentAdded() (определенное в контейнере) при добавлении новой вкладки и событии componentRemoved(), если табуляция удалена.

Вы должны иметь возможность слушать для добавления или удаления вкладки путем регистрации ContainerListener

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

stateChanged() события является лишь побочным эффектом оного, поскольку JTabbedPanel автоматически переключается на новый вкладка.

+0

пропустил то, что я на самом деле пытаюсь сделать, пожалуйста, проверьте мое редактирование. – Krishnaraj

2

Возможно, вы также захотите изучить свойство клиента __index_to_remove__, которое установлено removeTabAt().

+2

hmm ... не помогает при добавлении вкладки, afaics? – kleopatra

+0

@ kleopatra: Хорошая точка; Я также пропустил обновление к вопросу. Добавление подобного свойства в методы 'addTabAt()' кажется неудобным. Запросить разъяснения выше. – trashgod

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); 
Смежные вопросы