Java JTabbedPane вопросы - PullRequest
       22

Java JTabbedPane вопросы

1 голос
/ 07 января 2010

Я использую JTabbedPane для удержания каждого шага в мастере, который я создаю. Навигация между шагами осуществляется с помощью кнопок «Предыдущая / Следующая» или путем выбора вкладки. Кнопки уменьшают / увеличивают SelectedIndex JTabbedPane.

Мне нужно проверить каждый шаг, прежде чем переходить к следующему шагу. По сути, мне трудно определить, какое событие использовать. Событие StateChange происходит слишком поздно. Какое событие мне нужно наблюдать?

Еще одно раздражение: при запуске мастера, кажется, сохраняется состояние SelectedIndex JTabbedPane (обычно это значение последнего шага), затем это значение используется для установки SelectedIndex при следующем запуске мастера. Свойство selectedIndex в конструкторе не изменилось. Более того, вызов setSelectedIndex () в конструкторе JPanel, похоже, не влияет на это. Чего мне не хватает?

Ответы [ 5 ]

4 голосов
/ 07 января 2010

Вместо JTabbedPane рассмотрите использование CardLayout . Последний позволяет более жестко управлять навигацией.

2 голосов
/ 08 декабря 2010

Вы можете расширить JTabbedPane для переопределения метода setSelectedIndex, а затем вызвать super.setSelectedIndex (index); после выполнения вашей проверки что-то вроде:

public class ValidationTabbedPane extends JTabbedPane {
    private static final long serialVersionUID = 1L;

    public ValidationTabbedPane() {
        super();
      }

      @Override
      public void setSelectedIndex(int index) {
          if (index >= 0 && index < getTabCount()) {
              if(getSelectedIndex() == -1) {
                  super.setSelectedIndex(index);
              } else  {
                  Containers tab = tabs.get(getSelectedIndex());
                  boolean change = true;
                  if(tab.isDirty()) {
                      if(!MessageAlert.
                              yesNoMessage("You have unsaved changes. Do you want to change tab anyways? ", 
                                      mainTabbedPane)) {
                          change = false;
                      }
                  }
                  if(change) {
                      super.setSelectedIndex(index);
                  }
              }
          }           
      }
}
1 голос
/ 07 января 2010

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

Что вы можете попробовать (если вы настаиваете на использовании панели с вкладками, которая, возможно, не лучший вариант), это добавить прослушиватель мыши и использовать его вместе со стеклянной панелью. Это захватит событие мыши и позволит вам выполнить проверку. Если это удастся, вы изменяете вкладку программно.

alt text

Вам придется связывать события, что затрудняет написание кода (поэтому я полагаю, вы не видите вкладок в мастерах)

Что касается индекса, это потому, что вы используете тот же экземпляр. Это не имеет эффекта, потому что вы должны вызывать его на экземпляре, а не в конструкторе.

Вот пример использования GlassPanes .

alt text

Посмотрите, как в примере они перехватывают событие нажатия на кнопку. Вы можете попробовать что-то подобное с вкладкой тура.

1 голос
/ 07 января 2010

Во-первых, вы используете JTabbedPane, который указывает, что пользователь может выбирать вкладки в любом порядке для реализации мастера, который обычно требует выполнения шагов в последовательном порядке. Подумайте, подходит ли этот компонент пользовательского интерфейса.

Во-вторых, вам нужно изменить состояние вето, хотя его не существует "из коробки".

Я нашел это в ветке на форумах Sun :

Уловка, которую я использовал, состоит в том, чтобы заменить SingleSelectionModel, который используется JTabbedPane. Расширение DefaultSingleSelectionModel и переопределение метода setSelectedIndex, кажется, прекрасно справляются с задачей (вызов метода super только в том случае, если необходимо разрешить переключение).

Кроме того, у Кирилла Гручникова есть некоторые мысли здесь: " Приправить свой JTabbedPane - часть V ".

0 голосов
/ 29 ноября 2011

Неряшливая альтернатива (что я и собираюсь сделать, потому что я уже сделал большую часть и сейчас не склонен к радикальным изменениям) - установить для свойства enabled значение false. Кнопки вкладок будут отключены, но ваши следующие и предыдущие кнопки будут по-прежнему работать так, как ожидается. Если ваши пользователи это допустят, это может быть простым решением.

...