我正在使用Scene Builder构建一个javafx gui,我想要一个ComboBox,其中会发生一些事情" On Showing。"它看起来很简单,但是当我尝试实现它时崩溃了。我创建了一个只有一个组合框的简单版本,它仍然会崩溃。
这是Main.java模块:
package application;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
// BorderPane root = new BorderPane();
BorderPane root = (BorderPane) FXMLLoader.load(Main.class.getResource("Comboscreen.fxml"));
Scene scene = new Scene(root,400,400);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
这是fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>
<BorderPane xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Controller">
<center>
<VBox alignment="CENTER" prefHeight="400.0" prefWidth="400.0" BorderPane.alignment="CENTER">
<children>
<ComboBox fx:id="ComboTestBox" onAction="#ComboDo" onShowing="#Showaction" prefWidth="150.0" promptText="Testbox" />
</children>
</VBox>
</center>
</BorderPane>
这是控制器:
package application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;
public class Controller {
@FXML
public ComboBox<String> ComboTestBox;
@FXML
void ComboDo(ActionEvent event) {
System.out.println(" Option Chosen");
}
ObservableList<String> options =
FXCollections.observableArrayList(
"Option 1",
"Option 2",
"Option 3"
);
@FXML
void Showaction(ActionEvent event) {
System.out.println(" TestAction");
}
public void initialize() {
ComboTestBox.setItems(options);
}
}
看起来很简单,但每次都会崩溃。如果我删除&#34; onshowing&#34;行动,它工作得很好。任何建议都值得赞赏,因为我对此很陌生。
答案 0 :(得分:0)
假设&#34;崩溃&#34;你的意思是它给你一个运行时异常(为了将来参考,请在你的问题中包括stack trace,其中有很多信息可供你诊断问题):
onShowing
处理程序是EventHandler<Event>
,而不是EventHandler<ActionEvent>
,因此您需要:
@FXML
void Showaction(Event event) {
System.out.println(" TestAction");
}
请注意,如果您未使用Event
参数,则可以省略它,FXMLLoader
仍然可以映射到正确的处理程序方法:
@FXML
void Showaction() {
System.out.println(" TestAction");
}
但是,如果包含参数,则它必须是正确的类型。
顺便说一下,你应该使用适当的命名约定,即
@FXML
void showAction(Event event) {
System.out.println(" TestAction");
}
对FXML文件进行相应的更改。