我的 JavaFX Slider 没有改变值,它看起来冻结了

My JavaFX Slider does not change value, it appears frozen

当我尝试移动时,我的 JavaFX 滑块没有改变值。 我的滑块位于 GridPane 布局内。

我的代码如下所示,如果您需要更多,请询问:

    root = new GridPane();
    root.setLayoutY(canvasHeight);
    root.setGridLinesVisible(true);
    root.setPadding(new Insets(10, 10, 10, 10));
    root.setVgap(2);

    Label lblAmount = new Label("Amount of fireworks  : ");
    GridPane.setConstraints(lblAmount, 0, 0);
    root.getChildren().add(lblAmount);

    Slider sliAmount = new Slider();
    sliAmount.setMin(1);
    sliAmount.setMax(10);
    sliAmount.setValue(5);
    sliAmount.setMaxWidth(100);
    root.getChildren().add(sliAmount);
    GridPane.setConstraints(sliAmount, 1, 0);

    Label lblPSize = new Label("Size of particles : ");
    GridPane.setConstraints(lblPSize, 0, 1);
    root.getChildren().add(lblPSize);

    root.getRowConstraints().add(new RowConstraints(15));
    root.getColumnConstraints().add(new ColumnConstraints(140));

Here 的 GIF 可以更好地理解问题所在

这是我的小程序中的样子:

编辑:更多代码

因为我的程序非常小,几乎只有这里实现的滑块是我所有的代码。

主要class

public class Main extends Application {

    private final int CANVAS_WIDTH = 1600;
    private final int CANVAS_HEIGHT = 750;
    private final int MENU_HEIGHT = 150;

    private GraphicsContext graphics;
    private GUI gui;

    @Override
    public void start(Stage primaryStage) throws Exception{
        gui = new GUI(CANVAS_WIDTH, CANVAS_HEIGHT, MENU_HEIGHT);
        gui.setup();

        Canvas canvas = new Canvas(CANVAS_WIDTH, CANVAS_HEIGHT);

        graphics = canvas.getGraphicsContext2D();

        clearCanvas();


        gui.getRoot().getChildren().add(canvas);


        primaryStage.setTitle("FireworkSim by Cedric Martens");
        primaryStage.setScene(new Scene(gui.getRoot(), CANVAS_WIDTH, CANVAS_HEIGHT + MENU_HEIGHT, Color.rgb(137, 182, 255)));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }

    private void clearCanvas()
    {
        //graphics.setFill(Color.BLACK);
        //graphics.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);

    }
}

图形界面class

public class GUI {

    private GridPane root;
    private int canvasWidth;
    private int canvasHeight;
    private int menuHeight;

    public GUI(int canvasWidth, int canvasHeight, int menuHeight)
    {
        this.canvasWidth = canvasWidth;
        this.canvasHeight = canvasHeight;
        this.menuHeight = menuHeight;
    }

    public void setup()
    {
        root = new GridPane();
        root.setLayoutY(canvasHeight);
        root.setGridLinesVisible(true);
        root.setPadding(new Insets(10, 10, 10, 10));
        root.setVgap(2);

        Label lblAmount = new Label("Amount of fireworks  : ");
        GridPane.setConstraints(lblAmount, 0, 0);
        root.getChildren().add(lblAmount);

        Slider sliAmount = new Slider();
        sliAmount.setMin(1);
        sliAmount.setMax(10);
        sliAmount.setValue(5);
        sliAmount.setMaxWidth(100);
        root.getChildren().add(sliAmount);
        GridPane.setConstraints(sliAmount, 1, 0);

        Label lblPSize = new Label("Size of particles : ");
        GridPane.setConstraints(lblPSize, 0, 1);
        root.getChildren().add(lblPSize);

        root.getRowConstraints().add(new RowConstraints(15));
        root.getColumnConstraints().add(new ColumnConstraints(140));
    }

    public GridPane getRoot() {
        return root;
    }
}

您将 canvas 直接放置在 GUI class 创建的网格窗格中,而不指定任何布局属性(例如,行和列索引)。所以 canvas 直接覆盖网格窗格,并接收鼠标事件,阻止滑块接收它们。相反,使用布局窗格来适当地布置事物。例如:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class Main extends Application {

    private final int CANVAS_WIDTH = 1600;
    private final int CANVAS_HEIGHT = 750;
    private final int MENU_HEIGHT = 150;

    private GraphicsContext graphics;
    private GUI gui;

    @Override
    public void start(Stage primaryStage) throws Exception{

        BorderPane root = new BorderPane();
        gui = new GUI(CANVAS_WIDTH, CANVAS_HEIGHT, MENU_HEIGHT);
        gui.setup();

        Canvas canvas = new Canvas(CANVAS_WIDTH, CANVAS_HEIGHT);

        graphics = canvas.getGraphicsContext2D();

        clearCanvas();


        root.setCenter(canvas);
        root.setBottom(gui.getRoot());



        primaryStage.setTitle("FireworkSim by Cedric Martens");
        primaryStage.setScene(new Scene(root, CANVAS_WIDTH, CANVAS_HEIGHT + MENU_HEIGHT, Color.rgb(137, 182, 255)));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }

    private void clearCanvas()
    {
        graphics.setFill(Color.BLACK);
        graphics.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);

    }
}