2
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.OverrunStyle;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.control.Tooltip;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class BindTooltipToFocusEvent extends Application {
  @Override
  public void start(Stage stage) throws Exception {
    stage.setTitle("How to bind tooltip to focus event?");
    GridPane grid = new GridPane();
    grid.setAlignment(Pos.CENTER);
    grid.setHgap(10);
    grid.setVgap(5);
    grid.setPadding(new Insets(25, 25, 25, 25));
    grid.add(new Label("Email"), 0, 0);
    grid.add(new TextField(), 0, 1);
    grid.add(new Label("Password"), 0, 2);

    Tooltip tooltip = new Tooltip("Paswords must contain 1-50 characters, etc...");
    tooltip.setWrapText(true);
    tooltip.setTextOverrun(OverrunStyle.ELLIPSIS);
    PasswordField pf = new PasswordField();
    pf.setPromptText("Password");
    pf.setTooltip(tooltip);
    grid.add(pf, 0, 3);

    stage.setScene(new Scene(grid, 300, 275));
    stage.sizeToScene();
    stage.show();
  }
  public static void main(String[] args) { launch(); }
}

提供されているサンプル アプリケーションを実行すると、マウス ホバー イベントでツールチップを表示する Java FX のデフォルトのツールチップ動作が示されます。パスワード フィールドに 1 ~ 2 秒ホバーすると、ツールチップが表示されます。ユーザーがマウスでフィールド上にホバーしている間ではなく、ユーザーがパスワードを入力している間、ツールチップを表示したいと思います。

パスワード フィールドにフォーカスがあるときにツールチップが表示されるように、この動作をどのように変更できますか?

ユーザー インターフェイスに別のラベルを追加し、パスワード フィールドにフォーカスがあるときにその可視性プロパティを変更できることはわかっています。この質問は、使用例の回避策を求めているわけではありません。親フィールドにフォーカスがあるときにツールチップを表示する方法を具体的に知りたいです。

4

1 に答える 1

6

これを実現するには、ツールチップの可視性を管理し、自分自身を配置する必要があります。

@Override
public void start(Stage stage) throws Exception {
    stage.setTitle("How to bind tooltip to focus event?");
    GridPane grid = new GridPane();
    grid.setAlignment(Pos.CENTER);
    grid.setHgap(10);
    grid.setVgap(5);
    grid.setPadding(new Insets(25, 25, 25, 25));
    grid.add(new Label("Email"), 0, 0);
    grid.add(new TextField(), 0, 1);
    grid.add(new Label("Password"), 0, 2);

    final Tooltip tooltip = new Tooltip("Paswords must contain 1-50 characters, etc...");
    tooltip.setWrapText(true);
    tooltip.setTextOverrun(OverrunStyle.ELLIPSIS);
    final PasswordField pf = new PasswordField();
    pf.setPromptText("Password");
    //pf.setTooltip(tooltip);
    pf.focusedProperty().addListener(new ChangeListener<Boolean>() {
        @Override
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
            if (newValue) {
                tooltip.show(pf, //
                        // popup tooltip on the right, you can adjust these values for different positions
                        pf.getScene().getWindow().getX() + pf.getLayoutX() + pf.getWidth() + 10, //
                        pf.getScene().getWindow().getY() + pf.getLayoutY() + pf.getHeight());
            } else {
                tooltip.hide();
            }
        }
    });
    grid.add(pf, 0, 3);

    stage.setScene(new Scene(grid, 300, 275));
    stage.sizeToScene();
    stage.show();
}

このアプローチの欠点の 1 つは、ウィンドウが別の場所に移動またはドラッグされても、ツールチップが画面に表示されたままになることです。

于 2013-08-13T20:45:22.440 に答える