Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
包含EventHandler的循环是';是否按照javafx的预期工作?_Java_Javafx - Fatal编程技术网

包含EventHandler的循环是';是否按照javafx的预期工作?

包含EventHandler的循环是';是否按照javafx的预期工作?,java,javafx,Java,Javafx,我是JavaFX新手,在使用setOnMouseClicked方法时遇到问题。在下面的代码中,我尝试在嵌套循环中添加一个事件处理程序,以便为创建的每个矩形分配一个事件处理程序,该事件处理程序在鼠标单击时将矩形变为灰色。它似乎根本不起作用,我也不知道为什么。我是否遗漏了需要补充的内容 public class Cinema extends Application { @Override public void start(Stage primaryStage) {

我是JavaFX新手,在使用setOnMouseClicked方法时遇到问题。在下面的代码中,我尝试在嵌套循环中添加一个事件处理程序,以便为创建的每个矩形分配一个事件处理程序,该事件处理程序在鼠标单击时将矩形变为灰色。它似乎根本不起作用,我也不知道为什么。我是否遗漏了需要补充的内容

public class Cinema extends Application {

    @Override
    public void start(Stage primaryStage) {
        try {

            Screen screen1 = new Screen(8, 14);

            Pane root = FXMLLoader.load(getClass().getResource("Cinema.fxml"));

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

            VBox seatHolder = new VBox(5);

            seatHolder.setPrefWidth(root.getWidth());
            seatHolder.setPrefHeight(root.getHeight());

            seatHolder.prefWidthProperty().bind(root.widthProperty());
            seatHolder.prefHeightProperty().bind(root.heightProperty());

            seatHolder.setAlignment(Pos.CENTER);

            for (int i = 0; i < screen1.getSeats().length; i++) {

                HBox hbox = new HBox();

                hbox.setSpacing(1);

                hbox.setAlignment(Pos.CENTER);

                for (int j = 0; j < screen1.getSeats()[i].length; j++) {

                    Rectangle r = new Rectangle(30, 40);

                    r.setOnMouseClicked(new EventHandler<MouseEvent>() {

                        @Override
                        public void handle(MouseEvent event) {

                            r.setFill(Color.GREEN);
                        }
                    });

                    hbox.getChildren().add(r);

                    r.widthProperty().bind(root.heightProperty().divide(15));
                    r.heightProperty().bind(root.widthProperty().divide(30));

                    if (screen1.getSeats()[i][j] != null) {

                        r.setFill(Color.RED);
                    }

                    else {

                        r.setFill(Color.BLUE);
                    }

                }

                seatHolder.getChildren().add(hbox);
            }

            root.getChildren().add(seatHolder);

            HBox screenHolder = new HBox();

            screenHolder.setPrefWidth(root.getWidth());
            screenHolder.setPrefHeight(root.getHeight());

            screenHolder.prefWidthProperty().bind(root.widthProperty());
            screenHolder.prefHeightProperty().bind(root.heightProperty());

            Rectangle screen = new Rectangle(350, 25);

            screen.widthProperty().bind(seatHolder.widthProperty());

            screen.setFill(Color.LIGHTSLATEGREY);

            screenHolder.getChildren().add(screen);

            screenHolder.setAlignment(Pos.BOTTOM_CENTER);

            root.getChildren().add(screenHolder);

            primaryStage.setScene(scene);
            primaryStage.show();

        }

        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我认为当
r
的值被绑定时,与在处理函数中使用时相比,这可能是一个问题

在EventHandler中,尝试以下操作

@覆盖
公共无效句柄(MouseeEvent事件){
单击的矩形=(矩形)事件。getSource();
单击.setFill(颜色.绿色);
}
而不是在处理程序中引用
r

编辑: 看起来像是
屏幕支架
覆盖了所有的座位,所以你的点击永远不会注册。尝试设置
屏幕支架
尺寸以匹配屏幕本身:

矩形屏幕=新矩形(350,25);
screenHolder.setPrefWidth(screen.getWidth());
screenHolder.setPrefHeight(screen.getHeight());
screenHolder.prefWidthProperty().bind(screen.heightProperty());
screenHolder.prefHeightProperty().bind(screen.heightProperty());

问题在于
seatHolder
窗格添加在
screenHolder
窗格之前。这会导致
屏幕支架
位于
座椅支架
上方。通过添加
screenHolder.setStyle(“-fx背景色:#ffff00;”),您可以很容易地看到这一点。在这种情况下,永远不会调用EventHandler。您可以通过在handler方法中打印一些内容来检查这一点

您可以通过更改窗格添加到根窗格的顺序来解决此问题(
root.getChildren().addAll(screenHolder,seatHolder);
)。第一个是最低的,最后一个是最高的。或者,您也可以更改布局

我建议更改布局并使用:


这应该对你有用。在这种情况下,您甚至不需要fxml文件。

您也可以共享fxml内容吗?@Will170393您可以单击打印任何信息吗?例如,您是否可以打印单击项的当前填充颜色以确认处理程序正在启动?每次单击时,您应该会在控制台中看到一个条目<代码>System.out.println(r.getFill())
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.shape.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.Pane?>


<Pane maxHeight="-Infinity" maxWidth="-Infinity"
    minHeight="-Infinity" minWidth="-Infinity" prefHeight="558.0"
    prefWidth="714.0" xmlns="http://javafx.com/javafx/8"
    xmlns:fx="http://javafx.com/fxml/1" />
public class Screen {

    private String [][] seats;

    public Screen(int rows, int columns) {

        this.seats = new String [rows][columns];
    }

    public String[][] getSeats() {

        return seats;
    }
}
BorderPane root = new BorderPane();
Scene scene = new Scene(root, 400, 400);
VBox seatHolder = new VBox(5);
seatHolder.setAlignment(Pos.CENTER);

// setup seatHolder as before but use 

root.setCenter(seatHolder);

HBox screenHolder = new HBox();
Rectangle screen = new Rectangle(350, 25);
screen.widthProperty().bind(seatHolder.widthProperty());
screen.setFill(Color.LIGHTSLATEGREY);
screenHolder.getChildren().add(screen);
screenHolder.setAlignment(Pos.BOTTOM_CENTER);
root.setBottom(screenHolder);
primaryStage.setScene(scene);
primaryStage.show();