JavaFX-按钮不工作

JavaFX-按钮不工作,java,button,javafx,Java,Button,Javafx,创建一个基于俄勒冈州轨迹的小型rpg游戏。在控制器IntroController上,当leadboardcontroller正常工作时,我无法使手柄内的按钮做出反应 IntroController包含从排行榜控制器复制的两个按钮 public class Main extends Application { public Stage stage; @Override public void start(Stage primaryStage) { try

创建一个基于俄勒冈州轨迹的小型rpg游戏。在控制器
IntroController
上,当
leadboardcontroller
正常工作时,我无法使手柄内的按钮做出反应

IntroController
包含从
排行榜控制器
复制的两个按钮

public class Main extends Application {

    public Stage stage;

    @Override
    public void start(Stage primaryStage) {
        try {
            this.stage = primaryStage;
            initLayout();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /*
     * initLayout contains the functionality to set up the root and scene of the
     * JavaFX view using the desired FXML file, without the mess in start.
     * 
     */
    public void initLayout() {
        try {
            System.out.println("Working Directory = " + System.getProperty("user.dir"));

            Parent root = FXMLLoader.load(getClass().getResource("/fxml/Intro.fxml"));

            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.show();
            stage.setMaxHeight(500);
            stage.setMaxWidth(750);
            stage.setResizable(false);

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

    }

    /*
     * switchScene added to clean up mounts of code in regards to switching a scene usually from an actionevent. Takes in a string 
     * .fxml location and the Stage.
     */
    public void switchScene(String fxml, Stage stage) {
        try {
            Parent root = FXMLLoader.load(getClass().getClassLoader().getResource(fxml));
            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.show();
            stage.setMaxHeight(500);
            stage.setMaxWidth(750);
            stage.setResizable(false);
        } catch (IOException e) {
            // TODO handle exception
            e.printStackTrace();
            System.out.println("ERROR: Unable to open " + fxml);
            stage.close();
        }

    }

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

    }
}
公共类IntroController实现EventHandler,可初始化{
@FXML
按钮主菜单按钮;
@FXML
按钮退出按钮;
@FXML
锚烷背景;
@FXML
图像视图图片;
Main Main=新Main();
@凌驾
公共void初始化(URL位置、ResourceBundle资源){
showImage(“images/cilantoricelogo.png”);
}
/*
*句柄用作操作的主ActionEvent处理程序,例如
*当“点击某物”时,然后“这样做”。
* 
*@param ActionEvent事件
*/
@凌驾
公共无效句柄(ActionEvent事件){
所选按钮=(按钮)事件。getSource();
Stage Stage=(Stage)选中。getScene().getWindow();
如果(选定==主菜单按钮)
main.switchScene(“fxml/Title.fxml”,stage);
如果(选定==退出按钮)
stage.close();
背景。按下设置键(e->{
如果(例如getCode()==KeyCode.ENTER){
main.switchScene(“fxml/Title.fxml”,stage);
}
});
}
私有void showImage(字符串imageName){
图像;
试一试{
image=新图像(新文件输入流(imageName));
if(imageName.equals(“images/cilantoricelogo.png”))
picture.setImage(图像);
}catch(filenotfounde异常){
//TODO句柄异常!!
e、 printStackTrace();
}
}
}
公共类排行榜控制器实现EventHandler,可初始化{
@FXML
按钮退出按钮,主菜单按钮;
@FXML
TableView引导表;
@FXML
TableColumn rankColumn、nameColumn、HardicultyColumn、Score Column;
Main Main=新Main();
私有ObservableList分数=FXCollections.observableArrayList();
私人排行榜;
@凌驾
公共无效初始化(URL arg0,ResourceBundle arg1){
排行榜=新的排行榜();
设置核心();
rankColumn.setCellValueFactory(新属性值工厂(“排名”);
nameColumn.setCellValueFactory(新属性ValueFactory(“用户名”);
难易度Column.setCellValueFactory(新属性值工厂(“难易度”);
scoreColumn.setCellValueFactory(新的PropertyValueFactory(“finalScore”));
leaderTable.setItems(分数);
}
@凌驾
公共无效句柄(ActionEvent事件){
所选按钮=(按钮)事件。getSource();
Stage Stage=(Stage)选中。getScene().getWindow();
如果(选定==主菜单按钮)
main.switchScene(“fxml/Title.fxml”,stage);
如果(选定==退出按钮)
stage.close();
}
/**
*使用排行榜中的分数填充分数。分数
*/
公共核{
对于(分数:Leadboard.getScores()){
分数。添加(分数);
}
}
}
简介.fxml

Leadboard.fxml
如果不加载项目,很难判断。通常我要做的是在init方法中设置处理程序,看看是否可以触发它


另一个随机尝试是让处理程序使用基本事件:

因此,这是由Github合并/拉取错误引起的,已修复。这两者之间的某个东西导致了一个错误并破坏了这两个特定文件,通过更正该错误,该问题已得到解决。

您不需要使用controller类实现
EventHandler
。事实上,我建议在你确切知道自己在做什么之前不要这样做#methodName属性值在不考虑方法名称的情况下工作,并且不需要实现接口。您只需确保方法签名是适当的。这允许您使用不同的方法来处理不同节点上的事件,这些节点应执行不同的代码。同样,通过这种方式,您可以处理不同的事件类型,您的代码没有
onKeyTyped
->
KeyEvent
onMouseClicked
MouseEvent首先感谢@fabian编辑问题的格式,我非常感谢。我已经删除了onKeyTypedKeyEvent,但是对于按钮,无论我尝试使用if'((button)event.getSource()==mainMenu)还是if'(mainMenu.onMouseClicked!=null)[在SceneBuilder中指定分配点中的句柄],这两种解决方案都不适合我。
public class IntroController implements EventHandler<ActionEvent>, Initializable {


    @FXML
    Button mainMenuButton;

    @FXML
    Button exitButton;

    @FXML
    AnchorPane background;

    @FXML
    ImageView picture;

    Main main = new Main();


    @Override
    public void initialize(URL location, ResourceBundle resources) {
        showImage("images/cilantroRiceLogo.png");
    }

    /*
     * handle is used as the primary ActionEvent handler for actions such as
     * "when" something is clicked, "then" do so.
     * 
     * @param ActionEvent event
     */
    @Override
    public void handle(ActionEvent event) {
        Button selected = (Button) event.getSource();
        Stage stage = (Stage) selected.getScene().getWindow();

    if(selected == mainMenuButton) 
        main.switchScene("fxml/Title.fxml", stage);

    if(selected == exitButton) 
        stage.close();



        background.setOnKeyPressed(e -> {
            if (e.getCode() == KeyCode.ENTER) {
                main.switchScene("fxml/Title.fxml", stage);
            }

        });

    }

    private void showImage(String imageName) {
        Image image;

        try {
            image = new Image(new FileInputStream(imageName));

            if (imageName.equals("images/cilantroRiceLogo.png"))
                picture.setImage(image);

        } catch (FileNotFoundException e) {
            // TODO handle exception!!
            e.printStackTrace();
        }
    }
}
public class LeaderboardController implements EventHandler<ActionEvent>, Initializable {

    @FXML
    Button exitButton, mainMenuButton;

    @FXML
    TableView leaderTable;

    @FXML
    TableColumn rankColumn, nameColumn, difficultyColumn, scoreColumn;

    Main main = new Main();

    private ObservableList<Score> scores = FXCollections.observableArrayList();
    private Leaderboard leaderboard;

    @Override
    public void initialize(URL arg0, ResourceBundle arg1) { 

        leaderboard = new Leaderboard();
        setScores();

        rankColumn.setCellValueFactory(new PropertyValueFactory<Score, String>("rank"));
        nameColumn.setCellValueFactory(new PropertyValueFactory<Score, String>("userName"));
        difficultyColumn.setCellValueFactory(new PropertyValueFactory<Score, String>("difficulty"));
        scoreColumn.setCellValueFactory(new PropertyValueFactory<Score, String>("finalScore"));

        leaderTable.setItems(scores);
    }

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

        if(selected == mainMenuButton) 
            main.switchScene("fxml/Title.fxml", stage);

        if(selected == exitButton) 
            stage.close();

    }

    /**
     * populates scores with the Scores from leaderboard.scores
     */
    public void setScores() {
        for(Score score : leaderboard.getScores()) {
            scores.add(score);
        }
    }
}