无法导入 javafx fxml class
Cannot import javafx fxml class
在 netbeans 中使用 FXML 项目模板时,我遇到了在 FXML 文件中定义 FX 控制器的问题。
- 主要class、fxml文档和fxml控制器都在同一个包中:"login"。
- 我正在使用完全限定名称将控制器导入到 fxml 文档中。
- 导入行发生错误:"Class login.MyController does not exist."
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.*?>
这导致 "package login does not exist."
和
<?import MyController?>
从而导致class不存在。
所以我假设这是某种构建路径错误,但它们都在同一个包中。我什至将它们所在的包添加到其他源包中以从中构建,只是为了确保但这并没有解决任何问题。我的项目布局如下:
Project Name
Source Packages
login
Login.fxml
MyController.java
Main.java
我查看了有关此问题的另一个问题 postings,但似乎没有人遇到过此特定问题。但是,如果我确实错过了某人的 post 并给出了相同的答案,我会很乐意接受该参考。
您不必导入它。不过,您必须指定控制器的全名 class。
你的情况是 login.MyController
所以 fx:controller="login.MyController"
.
虽然您可能有一些其他问题,因为当我将该导入语句放入 fxml 时我没有遇到任何问题。只是没有必要。
确保您正在编辑的文档确实是您的包中的文档。
不知何故,在我的例子中,我实际上是在包外编辑一个具有相同名称的文档。这就是为什么当我尝试导入它时找不到控制器 class 的原因。
在 netbeans 中使用 FXML 项目模板时,我遇到了在 FXML 文件中定义 FX 控制器的问题。
- 主要class、fxml文档和fxml控制器都在同一个包中:"login"。
- 我正在使用完全限定名称将控制器导入到 fxml 文档中。
- 导入行发生错误:"Class login.MyController does not exist."
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.*?>
这导致 "package login does not exist."
和
<?import MyController?>
从而导致class不存在。
所以我假设这是某种构建路径错误,但它们都在同一个包中。我什至将它们所在的包添加到其他源包中以从中构建,只是为了确保但这并没有解决任何问题。我的项目布局如下:
Project Name
Source Packages
login
Login.fxml
MyController.java
Main.java
我查看了有关此问题的另一个问题 postings,但似乎没有人遇到过此特定问题。但是,如果我确实错过了某人的 post 并给出了相同的答案,我会很乐意接受该参考。
您不必导入它。不过,您必须指定控制器的全名 class。
你的情况是 login.MyController
所以 fx:controller="login.MyController"
.
虽然您可能有一些其他问题,因为当我将该导入语句放入 fxml 时我没有遇到任何问题。只是没有必要。
确保您正在编辑的文档确实是您的包中的文档。 不知何故,在我的例子中,我实际上是在包外编辑一个具有相同名称的文档。这就是为什么当我尝试导入它时找不到控制器 class 的原因。