如何在JavaFX中定位按钮

时间:2017-12-27 05:02:21

标签: button javafx layout netbeans java-8

我正在使用NetBeans IDE 8.2 for JavaFX。我已经知道,为了改变按钮的位置,我需要使用setLayoutX / Y.我试过这个,对按钮没有任何影响。这是我的代码:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javafxapplication2;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 *
 * @author coolDawg1234
 */
public class JavaFXApplication2 extends Application {

    @Override
    public void start(Stage primaryStage) {

        String x = "1";
        String y = "0";

        Button btn1 = new Button(x);
        btn1.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.print(x);
            }
        });

        Button btn2 = new Button(y);
        btn2.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.print(y);
            }
        });

        StackPane root = new StackPane();

        root.getChildren().add(btn1);
        btn1.setLayoutX(250);
        btn1.setLayoutY(220);
        root.getChildren().add(btn2);
        btn1.setLayoutX(200);
        btn1.setLayoutY(200);

        Scene scene = new Scene(root, 1000, 1000);

        primaryStage.setTitle("WHAT\'s GOOD MY MANS");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

Netbeans为此给出了0个错误,除了按钮位置之外的所有内容对我来说都很好。

请帮我找到问题所在。

1 个答案:

答案 0 :(得分:5)

按钮的容器是StackPaneStackPanePane的一种实现,默认情况下会将其子项布置在其自身的中心。因此,每当场景需要执行布局时,StackPane将根据其layoutX方法设置layoutYlayoutChildren()值(因此会覆盖您设置的任何内容)自己的布局策略。对Pane的大多数(如果不是全部)子类都会发生此行为。

如果需要手动定位子节点,则需要使用通用Pane容器。您可以选择对其进行子类化并提供自己的布局策略/逻辑,也可以直接在子节点上设置layoutXlayoutY值。

如果您需要StackPane提供的布局策略,但您希望它的位置与默认位置略有不同,那么您可能正在寻找translateXProperty()translateYProperty()