【发布时间】:2020-02-02 23:55:45
【问题描述】:
我正在做一些工作,要求我根据标量值为元素设置不同的值。我的工作是在一个名为 Sizer 的类中使用一个名为 getScalar() 的方法来计算标量值,该方法返回一个双精度值。下面是我现在拥有的部分 FXML。
<VBox id="mainWindow" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller">
<fx:define>
<Sizer fx:id="SCALAR" fx:factory="getScalar"/>
</fx:define>
<children>
<HBox alignment="CENTER_LEFT">
<children>
<Label fx:id="titleLabel" text="Label" HBox.hgrow="ALWAYS" />
<HBox fx:id="titleBar" HBox.hgrow="ALWAYS" />
</children>
<padding>
<!-- This part DOESN'T work at runtime -->
<Insets left="${SCALAR * 10.0}" right="${SCALAR * 10.0}" top="${SCALAR * 5.0}" />
</padding>
</HBox>
<!-- This part DOES work at runtime -->
<Separator prefWidth="${SCALAR * 200.0}" />
</children>
</Vbox>
在这段代码中,如果我取出 Insets 引用并将这些值设为 10.0、5.0 等,它会在运行时工作并出现我的对话框。使用 SCALAR 的“prefWidth”设置似乎工作正常,但是当我添加对 Insets 值的引用时,它会抛出并错误指向带有 Insets 的行。
javafx.fxml.LoadException: Cannot bind to untyped object.
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2621)
at javafx.fxml.FXMLLoader.access$100(FXMLLoader.java:105)
at javafx.fxml.FXMLLoader$Element.processPropertyAttribute(FXMLLoader.java:306)
at javafx.fxml.FXMLLoader$Element.processInstancePropertyAttributes(FXMLLoader.java:242)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:757)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
我的理解
您可以通过定义块创建这些已定义的对象,然后通过表达式绑定和变量解析在其他属性中引用它们,但不知何故,我无法使用 Insets 做到这一点。我发现的唯一一件事是“prefWidth”有一个二传手,而“左”或其他带有 Insets 的位置有一个 getter。我想它可能会在绑定到似乎没有设置器的对象时遇到问题。
任何帮助都将不胜感激,因为我对 FXML 不是很了解,而且我来自 JavaFX 世界,这要容易得多。
编辑 下面是Sizer类的内容
public static Toolkit getToolKit() {
return Toolkit.getDefaultToolkit();
}
public static Dimension getScreenSize() {
return getToolKit().getScreenSize();
}
public static int getPercentOfHeight(double percent) {
return (int)(getScreenSize().getHeight() * percent / 100.0);
}
public static int getPercentOfWidth(double percent) {
return (int)(getScreenSize().getWidth() * percent / 100.0);
}
public static double getScaleFactor() {
if ((int) getScreenSize().getHeight() > 1800) return 2.0; //4K
else if ((int)getScreenSize().getHeight() > 1260) return 1.33; //1440p
else if ((int)getScreenSize().getHeight() > 900) return 1.0; //1080p
else return 0.667; //720p
}
【问题讨论】:
-
能否请您展示
Sizer课程? -
查看我的回复:Bind Font Size in JavaFX?
-
@Slaw 我编辑了帖子以包含 Sizer 的内容
-
@jewelsea 我查看了这篇文章,它确实有一些有趣的想法,但对于我的问题,它只与 Insets 一起使用。我可以使用表达式绑定来使其他值正常工作,但即使我用具体值 left="${2.0 * 10.0}" 替换其中一个方向,它也不起作用。我只是不确定是否可以使用表达式绑定设置 Insets。