2

aButtonなどのボタンとともに、ウィンドウ内にいくつかのTextFieldがあります。TextField、Button、およびウィンドウはすべて setImmediate(True) を持っています。

TextField がフォーカスを失うと、いくつかの検証コードが実行され、失敗した場合は aButton.setEnabled(False); が呼び出されます。

1 つの TextField に誤ったデータが入力された後、フォーカスが失われると、デバッガーは aButton.setEnabled(False) が呼び出されたことを示しますが、aButton は引き続き有効に見えます。

ここから 2 つの可能性があります。

1.) 別の TextField のデータを変更してそのフィールドを終了する (フォーカスを失う) 場合、そのフィールドの検証が成功するかどうかはわかりますが、前の TextField がまだ無効であるため、システムは aButton.setEnabled(False) を呼び出すことを認識しています。今回は、aButton が視覚的に無効になっています。

2.) 視覚的に有効になっている aButton をクリックすると、次の警告が生成され、視覚的に無効になります: 警告: 無効なコンポーネントの変数の変更を無視します

現在 Vaadin 6.7.3 を使用しています

aButton を手動で無効に設定した後、すぐに aButton を強制的に視覚的に無効にする (クライアントを強制的に更新する) 既知の回避策はありますか?

4

2 に答える 2

2

悲しいことに、私は今自由に使える Vaadin 7しか持っていませんが、とにかくこれをチェックしました。あなたが望むように動作し、Vaadin 6.7.3 でも同じであるという結論に飛びつく必要があります。この部分は Vaadin7 とあまり変わりません...この機能を分離したコード (テキスト ボックスとボタンのみ) で試しましたか?

VerticalLayout vlTestContent = new VerticalLayout();
final Button butChangeMe = new Button("Enabled");
final TextField tf = new TextField("Blur", "default value");
tf.addBlurListener(new BlurListener() {
    private static final long serialVersionUID = 5544993392287938660L;
    @Override
    public void blur(BlurEvent event) {
        butChangeMe.setCaption("Disabled");
        butChangeMe.setEnabled(false);
    }
});
Button but = new Button("Change button", new ClickListener() {
    private static final long serialVersionUID = -2235317499126190105L;
    @Override
    public void buttonClick(ClickEvent event) {
        butChangeMe.setCaption("Enabled");
        butChangeMe.setEnabled(true);
    }
});
vlTestContent.addComponent(butChangeMe);
vlTestContent.addComponent(tf);
vlTestContent.addComponent(but);

(2番目のボタンはお遊び用です)

于 2013-07-01T18:06:56.097 に答える
1

button.setVisible(false) は常に機能します。ボタンの可視性を true に設定するフォーカス喪失イベントで別のイベントを起動しないように注意する必要があります。

コンポーネントまたはウィンドウ全体の再描画を要求できますが、視覚的に変更されたコンポーネントは要求ごとに自動的に再描画されるため、フレームワークの要点は、それを行う必要がないことです。

ブラウザが更新されるかどうかを確認する前に、リクエストを終了させますか? それとも、デバッガーで setVisible() 行を渡した直後にブラウザーを見ますか?

ボタンをクリックしたためにポイント番号2が発生すると思います。この順序で何が起こるかは次のとおりです。最初にフォーカスが失われたイベントが実行され(おそらくボタンが無効になります)、2番目のボタンクリックが実行され、何らかの形でそのボタンの再描画が要求されますボタンで状態の変更が発生しましたが、再描画すると、ボタンが無効になっているため何もしないという警告が表示されます (フォーカスが失われたイベントによって無効になっただけです)。

補足として。この UI はユーザー エクスペリエンスを向上させるものではないと思います。検証に問題がなければ、ボタンを表示する (または、常にボタンを表示し、代わりに有効/無効にする) べきです。しかし、状況によって異なります。 ...

于 2013-07-01T17:39:42.273 に答える