如何在JavaFX中编写按钮点击条件

How to write conditions on button click in JavaFX

我想让它在按下按钮时显示不同的 windows,为此我需要条件。我不想为每个按钮创建很多方法 此代码无效:

@Override
public void buttonOnAction(ActionEvent event){
    if(btnReaders.isPressed()){
    btnReaders.setOnAction(new EventHandler<ActionEvent>() {
        @Override public void handle(ActionEvent e) {
            Parent parent = null;
            try {
                parent = FXMLLoader.load(getClass().getResource("readersMenu.fxml"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            Scene scene = new Scene(parent);

            Stage window = (Stage) ((Node)event.getSource()).getScene().getWindow();

            window.setScene(scene);
            window.show();
        }
    });
    }
    else if(btnDashboard.isPressed()){
        btnDashboard.setOnAction(new EventHandler<ActionEvent>() {
            @Override public void handle(ActionEvent e) {
                Parent parent = null;
                try {
                    parent = FXMLLoader.load(getClass().getResource("librarianMenu.fxml"));
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                Scene scene = new Scene(parent);

                Stage window = (Stage) ((Node)event.getSource()).getScene().getWindow();

                window.setScene(scene);
                window.show();
            }
        });
    }
}

这是一个参数化事件处理程序的示例,它将在一个新场景中打开选定的 FXML,该场景将为包含事件源节点的同一阶段设置。

  1. 创建事件处理程序时,应用程序会在事件处理程序中存储要加载的 FXML 资源的名称。
  2. 事件处理程序已分配给按钮操作。
  3. 当按钮被操作时,事件处理程序将新的 FXML 加载到新场景中并将该场景附加到定义按钮的 window。

示例应用程序

对于此示例,FXML 文件应位于与包含 SceneSelector 应用程序的包相同的位置。

SceneSelector.java

import javafx.application.Application;
import javafx.event.*;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Insets;
import javafx.scene.*;
import javafx.scene.control.Button;
import javafx.scene.layout.*;
import javafx.stage.Stage;

import java.io.IOException;
import java.util.Objects;

public class SceneSelector extends Application {
    @Override
    public void start(Stage stage) {
        Button sceneAButton = new Button("Scene A");
        sceneAButton.setOnAction(
                new SceneChangeEventHandler(
                        "sceneA.fxml"
                )
        );

        Button sceneBButton = new Button("Scene B");
        sceneBButton.setOnAction(
                new SceneChangeEventHandler(
                        "sceneB.fxml"
                )
        );

        Pane layout = new HBox(10,
                sceneAButton,
                sceneBButton
        );
        layout.setPadding(new Insets(10));
        layout.setPrefSize(200, 150);
        stage.setScene(
                new Scene(layout)
        );
        stage.show();
    }

    class SceneChangeEventHandler implements EventHandler<ActionEvent> {
        private final String fxmlResourceName;

        public SceneChangeEventHandler(String fxmlResourceName) {
            this.fxmlResourceName = fxmlResourceName;
        }

        @Override
        public void handle(ActionEvent event) {
            try {
                Stage stage = (Stage) ((Node) event.getSource())
                        .getScene()
                        .getWindow();

                changeScene(stage, fxmlResourceName);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private void changeScene(
            Stage stage, 
            String fxmlResourceName
    ) throws IOException {
        Parent parent = FXMLLoader.load(
                Objects.requireNonNull(
                        getClass().getResource(
                                fxmlResourceName
                        )
                )
        );
        Scene scene = new Scene(parent);

        stage.setScene(scene);
        stage.setTitle(fxmlResourceName);
        stage.show();
    }

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

sceneA.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<StackPane xmlns="http://javafx.com/javafx"
           xmlns:fx="http://javafx.com/fxml"
           prefHeight="150.0" prefWidth="200.0" style="-fx-background-color: lemonchiffon;"/>

sceneB.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<StackPane xmlns="http://javafx.com/javafx"
            xmlns:fx="http://javafx.com/fxml"
            prefHeight="150.0" prefWidth="200.0" style="-fx-background-color: azure;"/>