1

我在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);
    }
4

2 回答 2

1

@FXMLtag 表示带注释的变量将由 FXML 引擎填充。所以你不应该调用new Button()那个变量。

通常有一个单独的 fxml 控制器类,用于填充@FXML变量和处理程序。请参阅此处的示例:https ://blogs.oracle.com/jmxetc/entry/connecting_scenebuilder_edited_fxml_to

在您的示例中,您要么覆盖了 FXML 创建的变量,要么没有在.fxml文件中正确设置 FXML 控制器。提供 fxml 内容以检查后一种情况。

于 2013-10-24T10:52:11.853 回答
1

您还可以直接为按钮操作注释处理程序,而无需显式调用...setOnAction(...)方法。这更容易一些,并且删除了 Java AWT/Swing 中用于管理事件(例如您拥有的)所需的大量样板代码。

Oracle 中的教程很好地解释了这一点,但作为一个简单的示例,您只需将onAction="#handlingMethod"as 属性添加到按钮,然后添加与@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 开发的原因之一。

祝你好运。

  • chooks
于 2013-10-24T18:45:43.127 回答