SceneBuilder - 添加依赖于第三方组件的自定义组件
SceneBuilder - Add custom component which relies on third party components
所以这个post:Custom FXML component (w/ controller) doesn't appear in SceneBuilder's "Import jar" dialog
它说你不能导入依赖于第三方组件的自定义组件。但我不敢相信(这太愚蠢了)……我现在正在努力根据库中的组件创建自定义组件 JFoenix.
所以我有这个 fxml 和控制器:
SelectableList.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXListView?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<fx:root type="AnchorPane" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1">
<children>
<VBox alignment="TOP_CENTER" prefHeight="743.2" prefWidth="400.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<Label fx:id="titleLabel" text="Title" textFill="#000000de">
<font>
<Font name="Roboto Medium" size="36.0" />
</font>
<VBox.margin>
<Insets bottom="40.0" top="40.0" />
</VBox.margin>
</Label>
<JFXListView fx:id="itemList" prefHeight="660.0" prefWidth="400.0" />
<JFXButton fx:id="addButton" focusTraversable="false" onAction="#addElement" prefHeight="50.0" prefWidth="500.0" styleClass="addbutton" stylesheets="@application.css" text="+" textFill="#21ce12ad">
<font>
<Font name="Roboto" size="33.0" />
</font>
</JFXButton>
</children>
</VBox>
</children>
</fx:root>
SelectableList.java
package de.goehring.components;
import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXListView;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
import java.io.IOException;
public class SelectableList<T> extends AnchorPane {
@FXML
private Label titleLabel;
@FXML
private JFXListView<T> itemList;
@FXML
private JFXButton addButton;
public SelectableList() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("SelectableList.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
@FXML
void addElement() {
}
}
我究竟做错了什么。当导入为 jar 时,我的 SceneBuilder 无法识别此组件。
@slaw 编辑的相关问题 post 解决了我的问题。
查看它:
所以基本上,如果您对这个主题感兴趣,请克隆 SceneBuilder 并通过在套件项目下检查 class JarExplorer
.
来开始调试它
通过 x.printStacktrace()
添加堆栈跟踪输出时,您会看到项目未加载的原因。
所以在我的例子中,正如 post 链接中提到的那样:你需要设置正确的 classloader。(并且缺少斜杠。诅咒你 java 资源。)
这就是我的构造函数现在的样子:
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/SelectableList.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
fxmlLoader.setClassLoader(getClass().getClassLoader());
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
之后,一切正常。
如果有人在启动 scenebuilder 项目时遇到问题:
使用 IntelliJ。您可以单击 build.gradle 并启动 "run" 任务。由于 java 11 需要在命令行中加载模块,因此您可以使用此方法。否则你会得到一个错误,告诉你 "JavaFX Components" 丢失了。
希望对您有所帮助。
所以这个post:Custom FXML component (w/ controller) doesn't appear in SceneBuilder's "Import jar" dialog
它说你不能导入依赖于第三方组件的自定义组件。但我不敢相信(这太愚蠢了)……我现在正在努力根据库中的组件创建自定义组件 JFoenix.
所以我有这个 fxml 和控制器:
SelectableList.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXListView?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<fx:root type="AnchorPane" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1">
<children>
<VBox alignment="TOP_CENTER" prefHeight="743.2" prefWidth="400.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<Label fx:id="titleLabel" text="Title" textFill="#000000de">
<font>
<Font name="Roboto Medium" size="36.0" />
</font>
<VBox.margin>
<Insets bottom="40.0" top="40.0" />
</VBox.margin>
</Label>
<JFXListView fx:id="itemList" prefHeight="660.0" prefWidth="400.0" />
<JFXButton fx:id="addButton" focusTraversable="false" onAction="#addElement" prefHeight="50.0" prefWidth="500.0" styleClass="addbutton" stylesheets="@application.css" text="+" textFill="#21ce12ad">
<font>
<Font name="Roboto" size="33.0" />
</font>
</JFXButton>
</children>
</VBox>
</children>
</fx:root>
SelectableList.java
package de.goehring.components;
import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXListView;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
import java.io.IOException;
public class SelectableList<T> extends AnchorPane {
@FXML
private Label titleLabel;
@FXML
private JFXListView<T> itemList;
@FXML
private JFXButton addButton;
public SelectableList() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("SelectableList.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
@FXML
void addElement() {
}
}
我究竟做错了什么。当导入为 jar 时,我的 SceneBuilder 无法识别此组件。
@slaw 编辑的相关问题 post 解决了我的问题。
查看它:
所以基本上,如果您对这个主题感兴趣,请克隆 SceneBuilder 并通过在套件项目下检查 class JarExplorer
.
通过 x.printStacktrace()
添加堆栈跟踪输出时,您会看到项目未加载的原因。
所以在我的例子中,正如 post 链接中提到的那样:你需要设置正确的 classloader。(并且缺少斜杠。诅咒你 java 资源。)
这就是我的构造函数现在的样子:
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/SelectableList.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
fxmlLoader.setClassLoader(getClass().getClassLoader());
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
之后,一切正常。
如果有人在启动 scenebuilder 项目时遇到问题:
使用 IntelliJ。您可以单击 build.gradle 并启动 "run" 任务。由于 java 11 需要在命令行中加载模块,因此您可以使用此方法。否则你会得到一个错误,告诉你 "JavaFX Components" 丢失了。
希望对您有所帮助。