我是 fxml 的新手,我仍在努力解决一些问题。通常,当我开发时,我会创建一些 *。属性文件,用于从中读取值。
这就是我通常做的事情:
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>file:${JBOSS_HOME}/standalone/configuration/someproject/properties/project.properties
</value>
</list>
</property>
</bean>
然后,当我宣布我的豆子时,我只读了我想要的任何价值。像这样:
<bean id="test" class="my.package.MyClass">
<property name="variable" value="${some.value}" />
</bean>
现在,我一直在寻找如何在fxml中做这样的事情,但我似乎找不到任何东西。 我为此而向noob道歉,但是有可能用fxml做这种事吗?
例如,在以下代码中,是否可以在外部定义图像的URL:
<VBox alignment="CENTER" styleClass="header" stylesheets="@../styles/some.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<children>
<AnchorPane>
<children>
<ImageView AnchorPane.leftAnchor="0.0" AnchorPane.topAnchor="22.0">
<image>
<Image url="@../img/image.png" />
</image>
</ImageView>
</children>
</AnchorPane>
PS :我正在尝试开发一个独立的应用程序,但我仍然希望在外部配置一些值,而无需在我需要更改内容时生成新的构建。
非常感谢。
答案 0 :(得分:5)
另一种方法是在FXMLLoader中分配资源包。
FXMLLoader loader = new FXMLLoader();
loader.setResources(ResourceBundle.getBundle("propertyreader.application"));
Parent root = loader.load(
getClass().getResourceAsStream(
"about.fxml"
)
);
访问语法略有不同(使用%
代替${
)。
<Label fx:id="version" text="%version"/>
示例应用
示例应用程序假定所有文件都位于名为propertyreader
的包中。
application.properties
version=1
about.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.HBox?>
<HBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefWidth="400.0" spacing="10.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<Label text="Property Reader Version:"/>
<Label fx:id="version" text="%version"/>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</HBox>
PropertyReaderApp.java
package propertyreader;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
import java.util.ResourceBundle;
public class PropertyReaderApp extends Application {
@Override
public void start(Stage stage) throws IOException {
FXMLLoader loader = new FXMLLoader();
loader.setResources(ResourceBundle.getBundle("propertyreader.application"));
Parent root = loader.load(
getClass().getResourceAsStream(
"about.fxml"
)
);
stage.setScene(new Scene(root));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
答案 1 :(得分:2)
可以这样做,但我还没有看到很多(任何)文档。诀窍是访问foo=bar
namespace
并使用属性填充它,然后再加载FXML。
给定属性文件application.properties:
Properties properties = new Properties();
Path propFile = Paths.get("application.properties");
properties.load(Files.newBufferedReader(propFile));
FXMLLoader loader = new FXMLLoader(getClass().getResource("path/to/fxml"));
properties.stringPropertyNames()
.forEach(key -> loader.getNamespace().put(key, properties.getProperty(key)));
Parent root = loader.load();
你可以这样做:
<Label text="${foo}"/>
然后在您的FXML文件中,您可以使用例如
访问属性echo $HIVE_HOME