JavaFX FXML 不响应文本输入或单击(事件)

JavaFX FXML not responding to text input or Click (Events)

我有一个简单的 JavaFx 项目,主要 class 作为 eclipse JavaFx 项目默认。

我已经定义了一个控制器,它看起来像 SceneBuilder 生成的骨架,所以一切都是默认的。

当我 运行 我的应用程序时,在 UI 我无法向两个文本字段输入数据,也无法从我的按钮事件处理程序看到控制台输出。

一个welcome.fxml文件如下图(删除所有其他代码以简化)

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

  <?import javafx.geometry.*?>
  <?import javafx.scene.effect.*?>
  <?import javafx.scene.image.*?>
  <?import javafx.scene.paint.*?>
  <?import javafx.scene.*?>
  <?import javafx.scene.canvas.*?>
  <?import javafx.scene.control.*?>
  <?import javafx.scene.text.*?>
  <?import java.lang.*?>
  <?import javafx.scene.layout.*?>

  <Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mouseTransparent="true" prefHeight="720.0" prefWidth="1100.0" style="-fx-background-color: #000000;" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Welcome_Controller">
     <children>
        <Button alignment="CENTER" contentDisplay="CENTER" depthTest="ENABLE" graphicTextGap="10.0" layoutX="496.0" layoutY="360.0" mouseTransparent="true" onAction="#OnSignInClick" opacity="0.82" prefHeight="38.0" prefWidth="109.0" style="-fx-background-radius: 100;" text="Sign In" textAlignment="CENTER" />
        <Button alignment="CENTER" contentDisplay="CENTER" layoutX="496.0" layoutY="409.0" mnemonicParsing="false" opacity="0.82" prefHeight="38.0" prefWidth="109.0" style="-fx-background-radius: 1000;" text="Sign Up" textAlignment="CENTER" />
        <Text fill="WHITE" layoutX="899.0" layoutY="702.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Copyright 2015, Dawood and Irtiza." />
        <TextField fx:id="tf_username" layoutX="427.0" layoutY="277.0" prefHeight="25.0" prefWidth="279.0" promptText="Enter new Username if you dont have an account " />
        <TextField fx:id="tf_password" layoutX="427.0" layoutY="312.0" prefHeight="25.0" prefWidth="279.0" promptText="Enter new password if you dont have an account" />
        <Label layoutX="355.0" layoutY="281.0" text="Username :" textFill="WHITE">
           <font>
              <Font size="14.0" />
           </font>
        </Label>
        <Label layoutX="355.0" layoutY="315.0" text="Password :" textFill="WHITE">
           <font>
              <Font size="14.0" />
           </font>
        </Label>
     </children>
  </Pane>

Welcome_controller.java 看起来像是场景生成器生成的默认骨架,代码如下

    package application;


    import java.io.IOException;
    import java.net.URL;
    import java.util.ResourceBundle;

    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.fxml.Initializable;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.TextField;
    import javafx.stage.Stage;

    public class Welcome_Controller implements Initializable {

        @FXML //  fx:id="btn_xxx"
        private Button btn_signin; // Value injected by FXMLLoader
        @FXML 
        private Button btn_signup;
        @FXML
        private TextField tf_username;
        @FXML
        private TextField tf_password;

        @Override // This method is called by the FXMLLoader when initialization is complete
        public void initialize(URL fxmlFileLocation, ResourceBundle resources)
        {
            //assert btn_signin != null : "fx:id=\"btn_signin\" was not injected: check your FXML file 'welcome.fxml'.";
            //assert btn_signup != null : "fx:id=\"btn_signup\" was not injected: check your FXML file 'welcome.fxml'.";
            // initialize your logic here: all @FXML variables will have been injected
        }

        @FXML private void OnSignInClick(ActionEvent event) throws IOException
        {   
            System.out.println("clicked");
        }

        @FXML
        void OnSignupClick(ActionEvent event) {
            System.out.println("clicked 2");

        }

    }

编辑:这是主要方法的class。

打包申请;

    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.stage.Stage;
    import javafx.scene.Scene;
    import javafx.scene.layout.Pane;

    public class Main extends Application {
        @Override
        public void start(Stage primaryStage) {
            try {
                Pane root = (Pane) FXMLLoader.load(Main.class.getResource("welcome.fxml"));
                Scene scene_1 = new Scene(root,1100,720);
                //scene_1.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
                //we can set the different scenes when it need to
                primaryStage.setScene(scene_1);
                primaryStage.setTitle("Translate Messenger");
                primaryStage.show();

            } catch(Exception e) {
                System.out.println("main may exception");
                e.printStackTrace();
            }
        }

        public static void main(String[] args) 
        {
            launch(args);
        }
    }

当我 运行 我的应用程序时,在 UI 我无法向两个文本字段输入数据,也无法从我的按钮事件处理程序看到控制台输出。

如有任何帮助,我们将不胜感激。

您已使用 mouseTransparent="true" 使根窗格对鼠标透明。这意味着在根窗格或其任何后代节点(即整个 UI)上的任何鼠标单击都将被忽略。因此,您不能单击按钮或使用鼠标将焦点放在文本字段上。 (请注意,尽管您可以使用 Tab 键导航 UI,并使用 space 键在获得焦点时生成按钮点击。)

从窗格和 "Sign In" 按钮中删除 mouseTransparent="true",它将正常工作。