1

構築中のウィザードの各ステップを保持するために JTabbedPane を使用しています。ステップ間のナビゲーションは、前/次ボタンを使用するか、タブを選択して行います。ボタンは、JTabbedPane の SelectedIndex をデクリメント/インクリメントします。

次のステップに進む前に、各ステップを検証する必要があります。基本的に、どのイベントを使用するかを判断するのに苦労しています。StateChange イベントの発生が遅すぎます。どのイベントを監視する必要がありますか?

別の問題: ウィザードが実行されると、JTabbedPane の SelectedIndex の状態 (通常は最後のステップの値) が保存されるように見えます。この値は、次にウィザードが実行されるときに SelectedIndex を設定するために使用されます。デザイナーの selectedIndex プロパティは変更されていません。さらに、JPanel のコンストラクターで setSelectedIndex() を呼び出しても、これには影響がないようです。私は何が欠けていますか?

4

5 に答える 5

4

JTabbedPaneの代わりに、 CardLayoutの使用を検討してください。後者を使用すると、ナビゲーションをより厳密に制御できます。

于 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 メソッドをオーバーライドすると、問題なく動作するようです (切り替えが許可される場合にのみスーパー メソッドを呼び出します)。

また、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 に答える