我使用一个fxml文件和一个Java类实现了一个自定义控件,类似于本官方教程中所解释的内容(参见下面的代码)。请注意,fxml根元素是用fx:root
定义的,我以编程方式调用setRoot
。
我尝试在应用程序的FXML布局中包含控件,应用程序加载良好(并按预期显示控件)。
但是,如果我尝试在Scene Builder 2.0中导入包含控件的jar文件,则该控件不会出现在要导入的组件列表中(与同一jar中的其他一些控件不同)。如果我选择“showjaranalysisreport”,它将显示由javafx引起的错误。fxml。LoadException:已指定根值
。
您知道为什么在场景生成器中加载时会出现此错误,即使它在实际应用程序中正确加载?
以下是FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.Font?>
<fx:root type="javafx.scene.layout.GridPane" id="MediaMetadataDisplay" hgap="20.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="200.0"
prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<columnConstraints>
<ColumnConstraints fillWidth="false" hgrow="NEVER" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="200.0"/>
<ColumnConstraints halignment="LEFT" hgrow="ALWAYS"/>
</columnConstraints>
<rowConstraints>
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="30.0" vgrow="SOMETIMES"/>
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="40.0" vgrow="SOMETIMES"/>
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="25.0" vgrow="SOMETIMES"/>
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="25.0" vgrow="SOMETIMES"/>
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="25.0" vgrow="SOMETIMES"/>
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="25.0" vgrow="SOMETIMES"/>
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="30.0" vgrow="SOMETIMES"/>
</rowConstraints>
<children>
<ImageView id="coverView" fx:id="coverView" fitHeight="200.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" GridPane.rowSpan="7"/>
<Label id="trackName" fx:id="trackName" maxWidth="1.7976931348623157E308" text="trackName" GridPane.columnIndex="1" GridPane.rowIndex="1">
<font>
<Font name="System Bold" size="16.0"/>
</font>
</Label>
<Label id="artist" fx:id="artist" maxWidth="1.7976931348623157E308" text="artist" GridPane.columnIndex="1" GridPane.rowIndex="2"/>
<Label id="album" fx:id="album" maxWidth="1.7976931348623157E308" text="album" GridPane.columnIndex="1" GridPane.rowIndex="3"/>
<Label id="genre" fx:id="genre" maxWidth="1.7976931348623157E308" text="genre" GridPane.columnIndex="1" GridPane.rowIndex="4"/>
<Label id="trackNumber" fx:id="trackNumber" maxWidth="1.7976931348623157E308" text="trackNumber" GridPane.columnIndex="1" GridPane.rowIndex="5"/>
</children>
</fx:root>
以及Java控制器/根元素:
package customjavafx.scene.control;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.scene.media.Media;
import java.io.IOException;
import java.util.Map;
public class MediaMetadataDisplay extends GridPane {
public MediaMetadataDisplay() {
final FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MediaMetadataDisplay.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
media.addListener((obs, oldVal, newVal) -> updateMedia(newVal));
}
private final ObjectProperty<Media> media = new SimpleObjectProperty<>((Media) null, "media");
@FXML private ImageView coverView;
@FXML private Label trackName;
@FXML private Label artist;
@FXML private Label album;
@FXML private Label genre;
@FXML private Label trackNumber;
public void updateMedia(Media media) {
// TODO show updated metadata
}
public ObjectProperty<Media> mediaProperty() {
return media;
}
public Media getMedia() {
return mediaProperty().get();
}
public void setMedia(final Media media) {
mediaProperty().set(media);
}
}
在场景生成器显示的stacktrace中,错误的原因是:
Caused by: javafx.fxml.LoadException: Root value already specified.
file:/Users/guillaumegaly/Library/Application%20Support/Scene%20Builder/Library/custom-controls_2.11.jar!/customjavafx/scene/control/MediaMetadataDisplay.fxml
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2613)
at javafx.fxml.FXMLLoader.createElement(FXMLLoader.java:2771)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2720)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
at customjavafx.scene.control.MediaMetadataDisplay.<init>(MediaMetadataDisplay.java:26)
... 18 more
我一直在关注Javafx-FXML教程中的文档,而我被困在了自定义组件部分。我的问题是,当我调用setRoot方法时,它会抛出一个“Root ready specified”错误。就我个人而言,我通过将root标记添加到定制组件FXML文档中来解决这个问题。它现在起作用了。
我加上这个,这样如果其他人有同样的问题,谷歌可以给他们答案。
拆下线路
fxmlLoader.setRoot(this);
您的FXML将根定义为AnchorPane(并且您不能将根设置两次,这就是为什么会出现错误)。
<fx:root type="javafx.scene.layout.GridPane" id="MediaMetadataDisplay" hgap="20.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="200.0"
prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
我真的很感谢这个帖子
已指定根值
我通过扩展现有控件创建了一个新控件,我希望在JavaFX场景中使用这个新控件。我希望能够使用Scene Builder编辑我的场景,但在将新控件添加到FXML文件后,我在打开Scene Builder时遇到。 例如,下面是我创建的一个类,它扩展了: 将此控件添加到FXML文件后... 为什么Scene Builder找不到我的新控件?我需要做什么才能让它找到并能够使用我的新控件? 如果需要,下面是
几个星期以来,我一直在想办法解决这个问题,现在我开始放弃了。我肯定做了什么根本错误的事情。不管怎样,这是我的情况。我以前用JavaFX做了一个简单的小程序,但现在发现了Scene Builder,并想用这个工具重新构建它。该项目包括几个经常重用的组件,如下面的组件。它由一个标签、一个滑块、一个文本字段和另一个自定义组件InfoIcon组成。 我已经了解到,在构建我称之为SliderVariable
我的自定义类: 然后尝试添加这个自定义类,如下所示: 我已经尝试搜索这个错误,但没有找到任何解释为什么这不应该工作。我找到的示例表明,应该可以从control类扩展,并将其直接导入到fxml文件中,事实确实如此。当运行程序时,它的工作是完美的,这是场景构建器的问题。 我意识到这是一个Java版本问题,但整个项目设置为Java9(53),我尝试过更改版本,但没有成功。
当我在一个舞台上工作时,我注意到我几乎有三次完全相同的东西。而不是那样(因为我讨厌那样),我决定把我有的3次,并把它变成一个自定义组件。 现在我知道我可以在代码中添加它,但我不能预测布局行为(其中两个将直接进入选项卡,第三个将进入网格窗格)。 我不想要的是: 这可能吗?我又从C#和VS2010中出来了,当涉及到自定义控件时,我有点被宠坏了,所以如果有可能让类似的事情发生,有人能告诉我怎么做吗? 是
我尝试用自定义控制器制作一个自定义组件。自定义组件已经显示在应用程序上,但我未能向其添加属性。 项目结构: null 布尔马尔科 完全错误: 原因:java.lang.nullPointerException:无法调用“javafx.scene.image.imageeview.setimage(javafx.scene.image.image)”,因为“controller.topbarbtn.