简体   繁体   English

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

[英]Scene builder in JavaFX label not working

Respected Sir, I am a complete beginner learning through some tutorial while following it I tried to make a simple button that will print "Hello WOrld" on to a Label.尊敬的先生,我是一个完整的初学者,通过一些教程学习,同时我尝试制作一个简单的按钮,将“Hello WOrld”打印到标签上。 But When I run the code the Button appears however, it doen't print helloWorld no matter how many times I press ...但是,当我运行代码时,按钮会出现,无论我按多少次,它都不会打印 helloWorld ...

1.Below is the HelloWorld.JAVA Code: 1.以下是HelloWorld.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);
    }
    
}

2.Below is the TesterController.JAVA Code: 2.下面是TesterController.JAVA代码:

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
    }    
    
}

3.Below is the Tester.fxml Code: 3.下面是Tester.fxml代码:

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>

4.Below is the Output Box Text After Running: 4.下面是运行后的输出框文本:

enter code here

ant -f C:\\Users\\Abdullah\\Documents\\NetBeansProjects\\HelloWorld jfxsa-run
init:
Deleting: C:\Users\Abdullah\Documents\NetBeansProjects\HelloWorld\build\built-jar.properties
deps-jar:
Updating property file: C:\Users\Abdullah\Documents\NetBeansProjects\HelloWorld\build\built-jar.properties
compile:
Detected JavaFX Ant API version 1.3
jfx-deployment:
jar:
Copying 12 files to C:\Users\Abdullah\Documents\NetBeansProjects\HelloWorld\dist\run141170950
jfx-project-run:
Executing C:\Users\Abdullah\Documents\NetBeansProjects\HelloWorld\dist\run141170950\HelloWorld.jar using platform C:\Program Files\Java\jdk1.8.0_111\jre/bin/java
Jul 24, 2021 4:31:25 AM javafx.fxml.FXMLLoader$ValueElement processValue
WARNING: Loading FXML document with JavaFX API of version 8.0.171 by JavaFX runtime of version 8.0.111
Deleting directory C:\Users\Abdullah\Documents\NetBeansProjects\HelloWorld\dist\run141170950
jfxsa-run:
BUILD SUCCESSFUL (total time: 8 seconds)

   

You're missing three things:你错过了三件事:

  1. The TesterController.printsHelloWorld(ActionEvent) method needs to be annotated with @FXML . TesterController.printsHelloWorld(ActionEvent)方法需要使用@FXML进行注释。

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

    This makes the method "visible" to the FXMLLoader .这使得该方法对FXMLLoader “可见”。

  2. The Button element in the FXML file needs its onAction attribute set. FXML 文件中的Button元素需要其onAction属性集。

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

    This tells the FXMLLoader to "link" the referenced controller's method to the button's on-action handler.这告诉FXMLLoader将引用的控制器方法“链接”到按钮的 on-action 处理程序。 Note the # prefix must be present.注意#前缀必须存在。

  3. The Label element in the FXML file needs an fx:id attribute equal to the field name in the controller. FXML 文件中的Label元素需要一个等于控制器中字段名称的fx:id属性。

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

    This lets the FXMLLoader inject the created Label instance into the controller's field.这让FXMLLoader将创建的Label实例注入到控制器的字段中。 In this case, that field is the @FXML private Label l1;在这种情况下,该字段是@FXML private Label l1; field.场地。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM