gpt4 book ai didi

java - 如何创建自定义 JavaFX 组件库?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:57:50 31 4
gpt4 key购买 nike

我玩 JavaFX 有一段时间了,现在我想分享一些我构建的组件。为了便于使用,我希望能够将组件作为库分发,这样其他用户只需将我的库导入 JavFX 项目即可。然而,事实证明,构建一个库文件以导入 SceneBuilder (SB) 比我预期的要难得多。我尝试关注 this blog post但我一定做错了什么。我想使用 .fxml 文件和 .jar 文件创建自己的自定义组件。

我尝试构建这个组件:

测试面板.java

package pack;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.layout.AnchorPane;

import java.io.IOException;

public class TestPane extends AnchorPane {
public TestPane(){
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("TestPane.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);

try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}

@FXML protected void onClick(ActionEvent ae){
System.out.println("Click");
}
}

测试面板.fxml

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

<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>


<fx:root type="AnchorPane" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1">

<Button fx:id="button" layoutX="6.0" layoutY="10.0" mnemonicParsing="false" text="Button" onAction="#onClick" />

</fx:root>

我使用 Eclipse Mars,创建了一个新的 JavaFX 库项目,创建了一个名为 pack 的新包。在那个包中,我从上面创建了两个组件。然后我右键单击该项目并选择“导出... -> Jar 文件”,并且在导出对话框中没有进行任何更改。

enter image description here

然后我创建了一个新的 FXML 项目。我在 SB 中打开 .fxml 文件并使用 Import JAR/FXML File...”对话框导入导出的 .jar 文件,然后将其拖到我的 View 中。

enter image description here

这是我创建的测试项目的代码。

LibTest.java 封装测试;

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

import java.io.IOException;

public class LibTest extends Application {

@Override
public void start(Stage primaryStage) throws IOException {
Parent root = FXMLLoader.load( getClass().getResource("LibTest.fxml") );
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();

}

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

LibTest.fxml

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

<?import pack.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>


<AnchorPane prefHeight="199.0" prefWidth="126.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.40">
<children>
<TestPane layoutX="34.0" layoutY="82.0" />
</children>
</AnchorPane>

我以为我现在已经遵循了所有在线指南和教程,但我一定遗漏了一些东西。然后,当我尝试启动我的测试项目时,出现以下错误。我知道 Caused by: javafx.fxml.LoadException: TestPane is not a valid type. 是“关键消息”,但它是什么意思,我该如何解决这个问题?

Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$152(LauncherImpl.java:182)
at com.sun.javafx.application.LauncherImpl$$Lambda$50/1645995473.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Caused by: javafx.fxml.LoadException: TestPane is not a valid type.
/D:/WorkspaceDir/ProjectDir/bin/test/LibTest.fxml:11

at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.createElement(FXMLLoader.java:2778)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2708)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2531)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2445)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3218)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3179)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3152)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3128)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3108)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3101)
at test.LibTest.start(LibTest.java:15)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(LauncherImpl.java:863)
at com.sun.javafx.application.LauncherImpl$$Lambda$53/198061478.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl$$Lambda$45/186276003.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$170(PlatformImpl.java:295)
at com.sun.javafx.application.PlatformImpl$$Lambda$48/1079803749.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(PlatformImpl.java:294)
at com.sun.javafx.application.PlatformImpl$$Lambda$47/237061348.run(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$145(WinApplication.java:101)
at com.sun.glass.ui.win.WinApplication$$Lambda$36/2117255219.run(Unknown Source)
... 1 more
Exception running application test.LibTest

我错过了什么?是什么导致了这个问题,我该如何解决?

最佳答案

问题是由于编译器(或VM,我不知道正确的时机)不知道如何创建一个类型为TestPane的对象。

请注意错误日志,它说错误发生在 D:/WorkspaceDir/ProjectDir/bin/test/LibTest.fxml:11。如果我们查看 LibTest.fxml 的第 11 行,我们会发现这是试图创建 TestPane 的行。

问题的解决方法是将库文件添加到Java项目的构建路径中。这将使您的项目正确了解如何创建 TestPane 类型的对象。右键单击项目 -> Build Path -> Configure Build Path... 然后,在 Libraries-tab 下,单击 Add JARs...(或 Add External JARs ...,如果 .jar 文件不在您的工作区内)并找到导出的 .jar 文件。

enter image description here

关于java - 如何创建自定义 JavaFX 组件库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32307442/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com