【问题标题】:Cannot import javafx fxml class无法导入 javafx fxml 类
【发布时间】:2018-09-22 20:20:06
【问题描述】:

在 netbeans 中使用 FXML 项目模板时,我在 FXML 文件中定义 FX 控制器时遇到了问题。

  • 主类、fxml 文档和 fxml 控制器都在同一个包中:“login”。
  • 我正在使用控制器的完全限定名称将控制器导入到 fxml 文档中。
  • 导入行出现错误:“类 login.MyController 不存在。”

FXML 文档

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ButtonBar?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.Polygon?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<?import login.MyController?>

<VBox prefHeight="400.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="login.MyController">
  <children>
    <AnchorPane maxHeight="-1.0" maxWidth="-1.0" prefHeight="-1.0" prefWidth="-1.0" style="-fx-background-color: #091D34;" VBox.vgrow="ALWAYS">
      <children>
        <Polygon fill="#000000b1" layoutX="363.0" layoutY="103.0" points="-50.0, 40.0, 50.0, 40.0, 50.0, -73.0" stroke="BLACK" strokeType="INSIDE" style="-fx-fill: #133863;" />
        <ButtonBar layoutX="233.0" layoutY="256.0" prefHeight="40.0" prefWidth="161.0">
          <buttons>
              <Button layoutX="135.0" layoutY="18.0" minWidth="49.0" mnemonicParsing="false" prefHeight="25.0" text="Login" onAction="#doLogin" />
              <Button layoutX="165.0" layoutY="18.0" mnemonicParsing="false" text="About" />
          </buttons>
        </ButtonBar>
        <PasswordField layoutX="186.0" layoutY="216.0" prefHeight="25.0" prefWidth="273.0" promptText="Password" onKeyPressed="#onEnter" />
        <TextField layoutX="186.0" layoutY="175.0" prefHeight="25.0" prefWidth="273.0" promptText="Username" />
        <Text layoutX="253.0" layoutY="76.0" strokeType="OUTSIDE" strokeWidth="0.0" style="-fx-fill: #236AB9;" text="Anatomy Law" textAlignment="CENTER" wrappingWidth="120.58984375">
           <font>
              <Font name="Aparajita" size="22.0" />
           </font>
        </Text>
  </children>
</AnchorPane>

控制器

package login;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;

public class MyController implements Initializable {


@FXML
public void doLogin(Event e){
    System.out.println("do login called");
}

@FXML
public void onEnter(KeyEvent ke){
    if(ke.getCode() == KeyCode.ENTER){
        System.out.println("on enter called");
        login();
    }
}

private void login(){

}

@Override
public void initialize(URL location, ResourceBundle resources) {

}

}

主要

package login;

import java.net.URL;
import javafx.application.Application;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

@Override
public void start(Stage stage) throws Exception {    
    FXMLLoader fxmlLoader = new FXMLLoader();
    MyController fxmlController = new MyController();

    fxmlLoader.setController(fxmlController);
    fxmlLoader.setLocation(new URL("C:/.../login/Login.fxml"));

    VBox vbox = fxmlLoader.<VBox>load();
    Scene scene = new Scene(vbox);

    stage.setScene(scene);
    stage.show();
}

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

}

注意 我最近在我的 FXML 文档中尝试了以下行:

<?import login.*?> 

导致“包登录不存在”。

还有

<?import MyController?>

这导致类不存在。

所以我假设这是某种构建路径错误,但它们都在同一个包中。我什至将它们所在的包添加到要构建的其他源包中,以确保但这并没有解决任何问题。我的项目布局如下:

Project Name 
    Source Packages 
        login
            Login.fxml
            MyController.java
            Main.java 

我查看了有关此问题的其他问题帖子,但似乎没有人遇到此特定问题。但是,如果我确实错过了具有相同答案的某人的帖子,我将很乐意参考。

【问题讨论】:

    标签: javafx fxml importerror


    【解决方案1】:

    您不必导入它。不过,您必须指定控制器类的全名。

    在你的情况下是login.MyController 所以fx:controller="login.MyController"

    虽然您可能会遇到一些其他问题,因为当我将该导入语句放入 fxml 时我没有任何问题。只是没有必要。

    【讨论】:

    • 它会编译,但定义和链接到按钮的函数永远不会被调用(例如 doLogin,在 mycontroller 类中定义)所以即使 NetBeans 不识别 import 语句,它实际上可能仍然无论如何都要工作?既然如此,也许我在创建 FXML 文件时只是捏造了。我将更新我的帖子以包含完整的 FXML 代码。
    • 加载 fxml 时控制器是否被初始化?
    • 不,它没有。我不太确定问题是什么。我跑了 system.out.println(MyController.class.getName());确保我使用的是完全限定名称,并且在将该名称复制并粘贴到 FXML 文档中(它们完全相同)之后没有区别。
    • 1.如果在 fxml 中指定控制器,则不必自己实例化它并设置为 FXMLLoader 的控制器。装载机会照顾它。 2. Initializeable接口被废弃,FXMLLoader会自动调用一个不带参数的initialize方法。因此,您可以删除实现,而是覆盖初始化方法,只需创建“public void initialize()”方法并检查它是否被调用。
    【解决方案2】:

    确保您正在编辑的文档绝对是您包中的文档。 不知何故,就我而言,我实际上是在编辑一个具有相同名称的包外的文档。这就是为什么我尝试导入它时找不到控制器类的原因。

    【讨论】:

      猜你喜欢
      • 2016-08-06
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 2020-02-06
      • 2014-02-03
      • 2015-12-14
      • 1970-01-01
      相关资源
      最近更新 更多