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

标签 java javafx javafx-2 fxml scenebuilder

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

我已经定义了一个 Controller ,它看起来像 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");

        }

    }

编辑:这是带有主要方法的类。

打包申请;

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

从 Pane 和“登录”按钮中删除 mouseTransparent="true",它将正常工作。

关于JavaFX FXML 不响应文本输入或单击(事件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33966306/

相关文章:

JavaFX - 按下按钮时滚动 scrollPane

java - Java 中 "this"关键字的说明

java - 为什么我的内容 Pane 不会显示在 JFrame 上?

java - 两个不同的套接字实例是否可以监听同一个 TCP 端口(端口已在使用中)

Javafx TableView 未显示所有列中的数据

javafx-2 - JavaFx HTMLEditor 不会占用容器上的所有可用大小

java - 我应该在 Struts2 View 层检索数据库记录吗?

java.time.DateTimeException : Unable to obtain LocalTime from TemporalAccessor: 2017-10-29 of type java. 时间.LocalDate

JavaFX 坐标相对于 Swing 在 Y 轴上反转

java - 如何验证 JavaFX 2.0 在 XP 机器上使用 directx 9?