是否可以使用 FXML 进行模板化
Is it possible to do templating with FXML
我想知道是否有可能使用 FXML 进行模板化,就像在 PHP 中使用 Twig 一样(当然还有很多其他模板马达)
使用 Twig 你会得到这样的视图:
布局:
<html>
<head>
<title>{% block title %}My Website{% endblock %}</title>
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>
some_page:
{% extends "layout" }
{% block title %}{{ parent() }} - Some page{% endblock %}
{% block body %}
<div>Some content</div>
{% endblock %}
这将在浏览器中呈现如下:
<html>
<head>
<title>My Website - Some page</title>
</head>
<body>
<div>Some content</div>
</body>
</html>
我的问题是:FXML 是否可以实现类似的功能。因此,我们将使用标准 FXML 和一些要在子 FXML 文件中重新定义的特殊标签,而不是 HTML。
我现在知道有一个包含机制,但这不是我要搜索的内容。包含假设您必须重新定义 "blocks",即使是空文件。我要的是继承机制
是否可以使用 FXML?
以下是我使用 Pebble 解决问题的方法。在我的实际项目中使用 Pebble 之前,以下示例为我提供了概念证明。我保持它非常简单,但它确实证明了我想要实现的目标是可能的。
Layout.pebble.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<BorderPane id="page" prefWidth="1280.0" prefHeight="900.0" xmlns:fx="http://javafx.com/fxml">
<top>
<MenuBar BorderPane.alignment="CENTER">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" onAction="#exitAction" text="Exit" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Help">
<items>
<MenuItem mnemonicParsing="false" text="About" />
</items>
</Menu>
</menus>
</MenuBar>
</top>
<center>
{% block body %}{% endblock %}
</center>
</BorderPane>
Index.pebble.fxml:
{% extends "templates/Layout.pebble.fxml" %}
{% block body %}
<VBox xmlns:fx="http://javafx.com/fxml/1">
<Text text="Test" />
</VBox>
{% endblock %}
App.java:
package be.dupirefr.pebblefx;
import java.io.File;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import com.mitchellbosecke.pebble.PebbleEngine;
import com.mitchellbosecke.pebble.template.PebbleTemplate;
import be.dupirefr.pebblefx.controllers.DumbController;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class App extends Application {
public static void main(String args[]) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
PebbleEngine engine = new PebbleEngine.Builder().build();
PebbleTemplate compiledTemplate = engine.getTemplate("templates/Index.pebble.fxml");
Map<String, Object> context = new HashMap<>();
File file = File.createTempFile("views/Index", "fxml");
file.deleteOnExit();
PrintWriter writer = new PrintWriter(file);
compiledTemplate.evaluate(writer, context);
writer.close();
primaryStage.setTitle("Pebble test");
FXMLLoader loader = new FXMLLoader();
loader.setController(new DumbController());
loader.setLocation(file.toURI().toURL());
BorderPane pane = loader.load();
Scene scene = new Scene(pane);
primaryStage.setScene(scene);
primaryStage.show();
}
}
进程生成了这个文件:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<BorderPane id="page" prefWidth="1280.0" prefHeight="900.0"
xmlns:fx="http://javafx.com/fxml">
<top>
<MenuBar BorderPane.alignment="CENTER">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" onAction="#exitAction"
text="Exit" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Help">
<items>
<MenuItem mnemonicParsing="false" text="About" />
</items>
</Menu>
</menus>
</MenuBar>
</top>
<center>
<VBox xmlns:fx="http://javafx.com/fxml/1">
<Text text="Test" />
</VBox>
</center>
</BorderPane>
FXMLLoader 成功使用。
当然,您可以使用 Pebble 的其他功能,但我想知道它是否适用于任何类型的文件,以及 FXMLLoader 是否会将临时文件作为输入。
我想知道是否有可能使用 FXML 进行模板化,就像在 PHP 中使用 Twig 一样(当然还有很多其他模板马达)
使用 Twig 你会得到这样的视图:
布局:
<html>
<head>
<title>{% block title %}My Website{% endblock %}</title>
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>
some_page:
{% extends "layout" }
{% block title %}{{ parent() }} - Some page{% endblock %}
{% block body %}
<div>Some content</div>
{% endblock %}
这将在浏览器中呈现如下:
<html>
<head>
<title>My Website - Some page</title>
</head>
<body>
<div>Some content</div>
</body>
</html>
我的问题是:FXML 是否可以实现类似的功能。因此,我们将使用标准 FXML 和一些要在子 FXML 文件中重新定义的特殊标签,而不是 HTML。
我现在知道有一个包含机制,但这不是我要搜索的内容。包含假设您必须重新定义 "blocks",即使是空文件。我要的是继承机制
是否可以使用 FXML?
以下是我使用 Pebble 解决问题的方法。在我的实际项目中使用 Pebble 之前,以下示例为我提供了概念证明。我保持它非常简单,但它确实证明了我想要实现的目标是可能的。
Layout.pebble.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<BorderPane id="page" prefWidth="1280.0" prefHeight="900.0" xmlns:fx="http://javafx.com/fxml">
<top>
<MenuBar BorderPane.alignment="CENTER">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" onAction="#exitAction" text="Exit" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Help">
<items>
<MenuItem mnemonicParsing="false" text="About" />
</items>
</Menu>
</menus>
</MenuBar>
</top>
<center>
{% block body %}{% endblock %}
</center>
</BorderPane>
Index.pebble.fxml:
{% extends "templates/Layout.pebble.fxml" %}
{% block body %}
<VBox xmlns:fx="http://javafx.com/fxml/1">
<Text text="Test" />
</VBox>
{% endblock %}
App.java:
package be.dupirefr.pebblefx;
import java.io.File;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import com.mitchellbosecke.pebble.PebbleEngine;
import com.mitchellbosecke.pebble.template.PebbleTemplate;
import be.dupirefr.pebblefx.controllers.DumbController;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class App extends Application {
public static void main(String args[]) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
PebbleEngine engine = new PebbleEngine.Builder().build();
PebbleTemplate compiledTemplate = engine.getTemplate("templates/Index.pebble.fxml");
Map<String, Object> context = new HashMap<>();
File file = File.createTempFile("views/Index", "fxml");
file.deleteOnExit();
PrintWriter writer = new PrintWriter(file);
compiledTemplate.evaluate(writer, context);
writer.close();
primaryStage.setTitle("Pebble test");
FXMLLoader loader = new FXMLLoader();
loader.setController(new DumbController());
loader.setLocation(file.toURI().toURL());
BorderPane pane = loader.load();
Scene scene = new Scene(pane);
primaryStage.setScene(scene);
primaryStage.show();
}
}
进程生成了这个文件:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<BorderPane id="page" prefWidth="1280.0" prefHeight="900.0"
xmlns:fx="http://javafx.com/fxml">
<top>
<MenuBar BorderPane.alignment="CENTER">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" onAction="#exitAction"
text="Exit" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Help">
<items>
<MenuItem mnemonicParsing="false" text="About" />
</items>
</Menu>
</menus>
</MenuBar>
</top>
<center>
<VBox xmlns:fx="http://javafx.com/fxml/1">
<Text text="Test" />
</VBox>
</center>
</BorderPane>
FXMLLoader 成功使用。
当然,您可以使用 Pebble 的其他功能,但我想知道它是否适用于任何类型的文件,以及 FXMLLoader 是否会将临时文件作为输入。