我正在尝试为实现Javafx中的按钮的鼠标设置鼠标事件。该程序附加到一个Excel文件中,该文件读取按钮数据。当我使用事件为它提供一种方法时,它说未处理的错误排除而我已经在这两种方法中抛出了错误。
@FXML
void initRecipes() throws IOException, InvalidFormatException {
File file = new File("src/main/resources/RecipeList/Recipes.xlsx");
String path = file.getAbsolutePath();
ExcelReader list = new ExcelReader(path);
int i = 10;
int sheetNo = 0;
categories.add(cheap);
categories.add(showstopper);
categories.add(quick);
categories.add(breakfast);
categories.add(deserts);
categories.add(salads);
for (HBox h : categories) {
for (int k = 0; k < list.getAmount(sheetNo); k++) {
String buttonId = Integer.toString(i) + Integer.toString(k + 1);
Button button = new Button(list.getName(buttonId, sheetNo));
button.setId(buttonId);
button.setStyle("-fx-background-image: url('" +
list.getImage(buttonId, sheetNo) + "')");
button.setPrefHeight(buttonHeight);
button.setPrefWidth(buttonWidth);
button.setOnMouseReleased(event -> changeScene(buttonId));
//Error occuring here ^^^^^
h.getChildren().add(button);
}
sheetNo++;
i += 10;
}
list.close();
}
void changeScene(String buttonId) throws IOException, InvalidFormatException {
File file = new File("src/main/resources/RecipeList/ingredients.xlsx");
String path = file.getAbsolutePath();
ExcelReader list = new ExcelReader(path);
SecondaryPresenter s = new SecondaryPresenter();
s.initialize();
}
我不太确定这是否是设置事件的正确方法,如果我已经抛出了2条我没有处理过的错误,为什么它会显示此错误。 有人知道我在做什么错吗? 谢谢
答案 0 :(得分:2)
void handle(T event)
由于您的changeScene
有一个throws
子句,其中包含不是RuntimeException
的异常,因此Java编译器确定您的lambda表达式中未处理这些异常。 lambda表达式的结果与以下代码非常相似:
button.setOnMouseReleased(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
changeScene(buttonId);
}
});
在上面的代码中,应该很容易看到handle
方法不能正确处理changeScene
引发的异常。
您需要在lambda表达式的主体中添加try/catch
:
button.setOnMouseReleased(event -> {
try {
changeScene(buttonId);
} catch (IOException | InvalidFormatException ex) {
// TODO: exception handling
}
});