1

[この質問はこの質問に関連しています]

設定:ラベルのように見える自作の「編集可能なラベル」コンポーネントがありますが、クリックすると編集可能なフィールドに変わり、編集できるようになります。Esc を押して編集をキャンセルするか、Shift-Enter を押して編集を OK するか、編集可能なフィールドの下にあるそれぞれのボタンをクリックします。

課題: この編集モードに入ると、UI の残りの部分を完全にブロックしたい: 編集をキャンセルするか OK してから、他の操作を行う必要があります。これを書いている間、私は明白なことに気付きました: これはまさにダイアログが動作する方法ですが、ダイアログを開くよりも「ドキュメント内」の編集ラベルの方が好きです。

4

4 に答える 4

2

ガラス板がいいかもしれません。すべてのイベントを簡単に盗み出し、一部をカスタム オブジェクトに送信できます。A wellbehaved glasspaneを実装する方法について説明している記事を次に示します。

于 2010-08-30T13:41:06.413 に答える
1

編集可能なラベルでは、編集を開始するときに、 を使用SwingUtilities.getRoot()してラベルのルートを取得し、 にキャストしContainerます。コンテナで を呼び出すことができますgetComponents()setEnabled(false)ラベルでない限り、この配列を反復処理して呼び出します。編集が完了したら、それらを有効にします。

1 つの質問: なぜそれが必要なのですか? ダイアログのような動作が必要な場合は、 を使用しますJOptionPane

ところで、JTextField と setOpaque(false) から境界線を削除すると、編集可能なラベルと同じになります。

于 2010-08-30T14:29:55.850 に答える
1

これはラフです。Swing には、1 つのコンポーネントを除いてすべての UI をブロックするメソッドはありません。これは、自分で構築する必要があるものです。私が使用する設計アプローチは次のとおりです。

  • EditableLabelListenerメソッドを定義するインターフェースを構築するeditableStateChanged(EditableLabelEvent)

  • プロパティとブール値EditableLabelEventを拡張AWTEventして追加するクラスを作成します。editableStateisEditable()

  • addEditableLabelListenerおよびのカスタム コンポーネントにメソッドを追加します。removeEditableLabelListener

  • コンポーネントを使用する各パネルで、コントローラー クラス (デザインによってはパネルの場合もあります) を実装EditableEventListenerし、それ自体をコンポーネントのリスナーとして登録します。

  • イベントが発生すると、コントローラ クラスはisEditableイベントのメソッドをチェックし、必要に応じてパネル上の他のすべてのコンポーネントを有効または無効にする必要があります。同じフォームに複数の編集可能なラベル コンポーネントがある場合getSource、イベントでメソッドを使用して、使用されているコンポーネントを特定し、他のコンポーネントを無効にすることができます。

于 2010-08-30T11:56:23.107 に答える
0

JDialog を拡張して、それを初期化すると、

this.setAlwaysOnTop(true);
this.setModalityType(ModalityType.APPLICATION_MODAL);
this.setVisible(false);
this.setVisible(true);

JDialog との対話のみを許可し、アプリケーション内の他のすべてをブロックします。

于 2010-08-30T12:44:26.500 に答える