1

我正在使用 JTabbedPane 来保存我正在构建的向导中的每个步骤。步骤之间的导航是使用上一个/下一个按钮或通过选择一个选项卡进行的。按钮减少/增加 JTabbedPane 的 SelectedIndex。

在进行下一步之前,我需要验证每个步骤。本质上,我很难确定要使用哪个事件。StateChange 事件发生得太晚。我需要观察哪个事件?

另一个恼人的是:当向导运行时,它似乎保存了 JTabbedPane 的 SelectedIndex 的状态(通常是最后一步的值),然后在下次运行向导时使用这个值来设置 SelectedIndex。设计器中的 selectedIndex 属性没有改变。此外,在 JPanel 的构造函数中调用 setSelectedIndex() 似乎对此没有影响。我错过了什么?

4

5 回答 5

4

考虑使用CardLayout而不是JTabbedPane。后者使您可以更严格地控​​制导航。

于 2010-01-06T22:15:57.750 回答
2

您可以扩展 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);
                  }
              }
          }           
      }
}
于 2010-12-07T23:24:33.643 回答
1

首先,您使用 JTabbedPane,它指示用户可以按任何顺序选择选项卡,以实现向导,这通常需要按顺序完成步骤。考虑一下这是否是正确的 UI 组件。

其次,您正在寻找的是可否决的状态更改,尽管它不存在开箱即用。

在 Sun 论坛的一个帖子中发现了这一点:

我使用的技巧是替换 JTabbedPane 使用的 SingleSelectionModel。扩展 DefaultSingleSelectionModel 并覆盖 setSelectedIndex 方法似乎可以很好地完成工作(仅在允许切换时调用 super 方法)。

此外,Kirill Grouchnikov 在这里有一些想法 - “为您的 JTabbedPane 增添趣味 - 第 V 部分”。

于 2010-01-06T22:13:13.133 回答
1

它发生得太迟,因为当标签已经改变时,当您需要的时候要知道它即将更改时,它会被解雇。

您可以尝试的(如果您坚持使用可能不是最佳选择的选项卡式窗格)是添加鼠标侦听器并将其与玻璃窗格一起使用。这将捕获鼠标事件并允许您执行验证。如果成功,则以编程方式更改选项卡。

替代文字

您必须连接事件,这使得代码有点难以编写(这就是我猜您在向导中看不到选项卡的原因)

至于索引,那是因为您使用的是同一个实例。它没有效果,因为您必须在实例上而不是在构造函数中调用它。

这是有关如何使用GlassPanes的示例。

替代文字

看看他们如何在示例中拦截按钮上的点击事件。您可以尝试使用游览选项卡进行类似的操作。

于 2010-01-06T22:13:48.563 回答
0

一个低俗的替代方案(这是我将要做的,因为我已经完成了大部分并且现在反对剧烈的变化)是将enabled属性设置为 false。选项卡按钮将被禁用,但您的下一个和上一个按钮仍将按预期运行。如果您的用户能够容忍这一点,那么这可能是一个简单的解决方案。

于 2011-11-29T19:18:37.343 回答