JavaFX-按钮不工作
创建一个基于俄勒冈州轨迹的小型rpg游戏。在控制器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
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
。事实上,我建议在你确切知道自己在做什么之前不要这样做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);
}
}
}