【发布时间】:2016-10-17 16:23:50
【问题描述】:
我正在尝试使用 fx:define 定义动态评估变量,但我无法从另一个变量中获得要评估的变量,我什至不知道这是否可能?
<GridPane hgap="${10*m.dp}" vgap="${10*m.dp}" xmlns="http://javafx.com/javafx/8.0.51" xmlns:fx="http://javafx.com/fxml/1">
<fx:define>
<Measurement fx:id="m" />
<!-- This works, but is not what I need -->
<Double fx:id="width" fx:value="300" />
<!-- This doesn't work -->
<!-- <Double fx:id="width" fx:value="${300*m.dp}" /> -->
</fx:define>
<padding>
<Insets bottom="$width" left="$width" right="$width" top="$width" />
</padding>
<Text text="hello" />
<Button GridPane.rowIndex="1" text="button" prefWidth="${300*m.dp}" />
<Button GridPane.rowIndex="2" text="button2" prefWidth="$width" />
</GridPane>
我在这里想要的是从我计算的 dp 计算宽度(密度独立像素 - 在高清屏幕中值为 1,在 4K 屏幕中为 2,在我的 1600px 宽度屏幕上为 0.xx)。我想要的“宽度”变量在我的真实案例中用于很多组件,这就是我想要一个变量的原因 - 为了简洁。
运行它的java代码
public class Measurement {
private double dp;
public Measurement(){
Screen primary = Screen.getPrimary();
dp=primary.getBounds().getWidth()/1920;
}
/**
* Equivalent of 1 px in 1920.
*/
public double getDp(){
return dp;
}
public void setDp (double dp) {
this.dp = dp;
}
}
public class MApplication extends Application {
public static void main (String[] args) {
launch (args);
}
@Override
public void start (Stage primaryStage) throws Exception {
FXMLLoader fxmlLoader = new FXMLLoader();
Parent root = fxmlLoader.load(getClass().getResource("index.fxml").openStream());
Scene scene = new Scene(root, 300, 275);
primaryStage.setMaximized(true);
primaryStage.setScene(scene);
primaryStage.show ();
}
}
其实我也不清楚可以用哪个和在哪里表达,我在这里看到很多答案:Is it possible to use arithmetic expression in FXML?
不明白在什么情况下可以使用表达语言,有规范吗?
已编辑:我添加了指向 javafx-8 文档的链接,并删除了对 javaFX-2 的过时评论
【问题讨论】:
-
你可以使用多个
fx:define标签吗?是这样,也许可以尝试看看是否可以看到前者的定义。 -
@Cyrille_Pontvieux 是的,我们可以,我试过了,但它没有任何改变,它很像定义块的多个声明,具有相同的变量声明,但如果我知道“fx”的实现在哪里:define" 是,我可以尝试调试。