微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JavaFX 标签中的场景构建器不起作用

如何解决JavaFX 标签中的场景构建器不起作用

尊敬的先生, 我是一个完整的初学者,通过一些教程学习,同时遵循它我尝试制作一个简单的按钮,将“Hello WOrld”打印到标签上。但是当我运行代码时,Button 出现了,无论我按多少次它都不会打印 helloWorld ...

1.以下是HelloWorld.JAVA代码

 //Libraries 

  //    implementation platform('com.google.cloud:libraries-bom:20.8.0')
   
  
         //    compile ('com.google.cloud:google-cloud-speech')

2.下面是TesterController.JAVA代码

enter code here

package helloworld;

import java.io.IOException;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;


public class HelloWorld extends Application {
    
    @Override
    
    public void start(Stage primaryStage){
    
    try {
            Parent root = FXMLLoader.load(getClass().getResource("/helloworld/Tester.fxml"));
           

        
        Scene scene = new Scene(root);
        
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
    
}

3.下面是Tester.fxml代码

enter code here

package helloworld;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;


public class TesterController implements Initializable {

    @FXML
    private Label l1;
    void printsHelloWorld(ActionEvent event){
        l1.setText("Hello World");

    }
    
    
    
    @Override
    public void initialize(URL url,ResourceBundle rb) {
        // Todo
    }    
    
}

4.下面是运行后的输出框文本:

enter code here

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>


<AnchorPane id="AnchorPane" prefheight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.171" fx:controller="helloworld.TesterController">
   <children>
      <Button layoutX="201.0" layoutY="155.0" mnemonicParsing="false" prefheight="161.0" prefWidth="175.0" text="Button" />
      <Label layoutX="170.0" layoutY="59.0" prefheight="46.0" prefWidth="237.0" />
   </children>
</AnchorPane>

解决方法

您缺少三件事:

  1. TesterController.printsHelloWorld(ActionEvent) 方法需要使用 @FXML 进行注释。

    @FXML
    void printsHelloWorld(ActionEvent event) {
      l1.setText("Hello,World!");
    }
    

    这使得该方法对 FXMLLoader“可见”。

  2. FXML 文件中的 Button 元素需要其 onAction 属性集。

    <Button onAction="#printsHelloWorld" .../>
    

    这告诉 FXMLLoader 将引用的控制器的方法“链接”到按钮的 on-action 处理程序。请注意,必须存在 # 前缀。

  3. FXML 文件中的 Label 元素需要一个与控制器中的字段名称相同的 fx:id 属性。

    <Label fx:id="l1" .../>
    

    这让 FXMLLoader 将创建的 Label 实例注入到控制器的字段中。在本例中,该字段是 @FXML private Label l1; 字段。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。