我在 JavaFX& Scene Builder 试图让一个按钮在控制台中显示文本(只是为了看它是否正常工作),但它没有响应。我不知道它为什么不开火。我的按钮ID为fx:id="testButton
。
public class Main extends Application
{
@FXML // fx:id=testButton
final Button testButton = new Button("Test");
private void actionListeners()
{
testButton.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent event)
{
System.out.println("Working");
}
});
}
@Override
public void start(Stage primaryStage) throws IOException
{
Parent page = FXMLLoader.load(Main.class.getResource("TestFXML.fxml"));
Scene scene = new Scene(page);
primaryStage.setScene(scene);
primaryStage.setTitle("Testing");
primaryStage.show();
actionListeners();
}
public static void main(String[] args)
{
launch(args);
}
答案 0 :(得分:1)
@FXML
标记表示FXML引擎将填充带注释的变量。因此,您不应该为该变量调用new Button()
。
通常fxml控制器有一个单独的类,它填充@FXML
个变量和处理程序。请参阅此处的示例:https://blogs.oracle.com/jmxetc/entry/connecting_scenebuilder_edited_fxml_to
在您的示例中,您要么覆盖FXML创建的变量,要么未在.fxml
文件中正确设置FXML Controller。提供fxml内容以检查后一种情况。
答案 1 :(得分:1)
您还可以直接为按钮操作注释处理程序,而无需显式调用...setOnAction(...)
方法。这样做更容易一些,并删除了Java AWT / Swing中用于管理事件(例如您)所需的大量样板代码。
Oracle中的教程非常擅长解释这一点,但作为一个简单示例,您只需要将onAction="#handlingMethod"
作为属性添加到按钮,然后将相应的@FXML public void handlingMethod(ActionEvent evt) {....}
添加到控制器。例如:
<强> FXML 强>
<Button onAction="#doATask" text="Do A Tas" />
控制器
@FXML
public void doATask(ActionEvent evt) {....}
如上所述,您需要确保为FXML设置控制器(此时在FXML中声明它是最简单的,尽管您可以根据需要以编程方式设置它)。使用此方法,您甚至不需要对Button对象的引用来使用它,这有助于使代码更清晰。
这真的很简单,这也是我喜欢JavaFX在Swing或AWT开发之上的界限的原因之一。
祝你好运。