2010-01-06 2 views
1

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

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

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

ответ

4

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

+0

CardLayout работает хорошо. Два связанных вопроса. 1: Есть ли способ показать вкладки? 2: Какое событие я могу использовать для проверки записи на каждой карте? – craig

+0

«Какое событие я могу использовать для проверки записи на каждой карте?» - когда пользователь нажимает кнопку «Далее», сделайте проверку в методе actionPerformed(), и если проверка не выполнена, не меняйте панель. –

+0

«Есть ли способ показать вкладки?» - Я не думаю, что вы хотите показывать вкладки, но я думаю, вы можете показать список шагов и указать, на каком этапе работает пользователь. Я бы рекомендовал вертикальную панель с левой стороны панели мастера, JLabels для каждого шага и выделение жирным выделенным цветом для текущего шага. –

1

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

Во-вторых, то, что вы ищете, является изменением состояния вето, хотя это не существует из коробки.

Я нашел это в a thread in Sun's forums:

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

Также у Кирилла Грухникова есть мысли - «Spicing up your JTabbedPane - part V».

+0

Спасибо за помощь. – craig

1

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

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

alt text http://java.sun.com/docs/books/tutorial/figures/uiswing/components/1layers.gif

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

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

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

alt text http://java.sun.com/docs/books/tutorial/figures/uiswing/components/GlassPaneDemo.png

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

2

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

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

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

Смежные вопросы