以编程方式在JavaFX中的文本字段旁边显示消息

时间:2014-08-27 17:08:02

标签: javafx-2

我的JavaFX应用程序中有TextField。我想以编程方式在文本的右侧显示一条消息(如验证消息)。我考虑过使用Popup并在Label中设置Popup消息。但我不确定如何将其置于文本字段的右侧。以下是此示例代码。你能帮帮我吗?

public void start(Stage primaryStage) {
        primaryStage.setTitle("JavaFX Welcome");
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(25, 25, 25, 25));

        Text scenetitle = new Text("Welcome");
        scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
        grid.add(scenetitle, 0, 0, 2, 1);

        Label userName = new Label("User Name:");
        grid.add(userName, 0, 1);

        TextField userTextField = new TextField();
        grid.add(userTextField, 1, 1);

        Label pw = new Label("Password:");
        grid.add(pw, 0, 2);

        PasswordField pwBox = new PasswordField();
        grid.add(pwBox, 1, 2);


        Label label=new Label();
        label.setText("This is an error message");

        final Text actiontarget = new Text();
        grid.add(actiontarget, 1, 6);


        final Popup popup = new Popup(); 

        popup.getContent().add(label);

        //Want to display this popup to the right of the userTextField.

        Scene scene = new Scene(grid, 300, 275);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

1 个答案:

答案 0 :(得分:1)

显示舞台后,执行

    Bounds userTextFieldBounds = userTextField.getBoundsInLocal();
    Point2D popupLocation = userTextField.localToScreen(userTextFieldBounds.getMaxX(), userTextFieldBounds.getMinY());
    popup.show(userTextField, popupLocation.getX(), popupLocation.getY());

在Java 8中引入了localToScreen(...)方法;如果您使用的是早期版本,则需要

    Bounds userTextFieldBounds = userTextField.getBoundsInLocal();
    Point2D popupLocation = userTextField.localToScene(userTextFieldBounds.getMaxX(), userTextFieldBounds.getMinY());
    popup.show(userTextField, 
        popupLocation.getX()+scene.getX()+primaryStage.getX(), 
        popupLocation.getY()+scene.getY()+primaryStage.getY());