0

私はいくつかのフィールドをそのように追加したグリッドレイアウトの魔女を持っています:

 private Component userDetailsTab(final User user) {
        final GridLayout details = new GridLayout(2, 1);
        details.setMargin(true);
        details.setSpacing(true);

        details.addComponent(createDetailLabel(Messages.User_Name));
        final Component username = createDetailValue(user.getName());
        details.addComponent(username);

        ...

テキストフィールドのラベルを置き換えるレイアウトクリックリスナーもあります。次のようになります。

 final TextField tf = new TextField();

        details.addListener(new LayoutClickListener() {

            private static final long serialVersionUID = -7374243623325736476L;

            @Override
            public void layoutClick(LayoutClickEvent event) {

                Component com = event.getChildComponent();
                if (event.getChildComponent() instanceof Label) {
                    Label label = (Label)event.getChildComponent();
                    details.replaceComponent(com, tf);
                    tf.setValue(label.getValue());
                }
            }
        });

将来的には、ラベルのクリックを有効にして編集し、別の場所 (別のラベルなど) をクリックした後にデータベースに変更を書き込みたいと考えています。

1 番目のラベルをクリックしてから 2 番目のラベルをクリックすると、効果は次のようになります。なぜそのようになるのでしょうか?1st をクリックしてから 2nd をクリックした後、1st の 1st ラベル ウィッチ値を取得するにはどうすればよいですか?

4

2 に答える 2

1

Label と TextField を切り替える必要はありません。TextField を使用して、フォーカスされていないときに Label のようにスタイルを設定できます。

于 2013-02-08T08:47:17.890 に答える
0

クリックして編集できるラベルを作成しようとすると、大量の余分な作業が発生しました。私はそれを思いとどまらせます(そして、パットンがコメントで示唆しているようにします)。

ただし、どうしてもインプレース編集を作成しようとする場合は、次のことを行う必要があります。

  • レイアウトを拡張する新しいクラス (Horizo​​ntalLayout など) を作成します。これにより、テキスト フィールドのラベルを交換できます。
  • LayoutClickListener を使用して removeComponent(myLabel) および addComponent(myTextField)
  • BlurListener を使用してラベルに戻します
  • テキストフィールドで ValueChangeListener を使用して、その値をラベルにコピーします

次の理由から、これは依然として悪い考えです。

  • ユーザーはアフォーダンスを簡単に見ることができません (何が編集可能かわかりません)
  • ユーザーはキーボードを使用して、編集するフィールドに移動できません
  • 不必要な複雑さ (メンテナンス時間など) が追加されます。

インプレース編集が必要な場合は、テキスト フィールドを表示し、新しい値を BlurListener で保存することをお勧めします。

于 2013-02-07T18:51:28.910 に答える