JavaFX-FXML

FXML Enhancements Made in JavaFX 2.1 and 2.2

JavaFX 2.1和2.2版本中,增加了如下改进:

* 提供前置反斜杠作为转意字符

   JavaFX 2.0使用连续的操作字符作为转意字符,比如$$,%%,@@。在JavaFX 2.1中增加反斜杠作为转意字符,比如\$,\%,\@。这使转意字符再接近统一表达式语言(UEL),    并且开发人员更熟悉。JavaFX 2.0中的转意字符在JavaFX 2.1中被弃用。

* 控制文档命名空间的隐藏(implicit)变量

   有一个特性双向绑定控件和UI。双向绑定在JavaFX 2.1中被抛弃,但这个特性被保留。

* 简化构建FXMLLoader类

   FXMLLoader类增加了一些新的简单易用的构造函数。

* 可定制控件实例化

   //以待日后补充

* 简化使用样式表(style sheets)

   在JavaFX 2.0中,在FXML中应用样式表并不容易。但在JavaFX 2.1中,已经变得很简单。样式表可以作为属性被特别写到根元素<Scene>:

   <Scene stylesheets="/com/foo/stylesheet1.css, /com/foo/stylesheet2.css"></Scene>

   单个节点可以这样使用样式类型:

   <Label styleClass="heading, firstPage" text="First Page Heading"/>

* 调用具体的无参数(Caller-specified no-arg)控件方法作为事件handler

   在JavaFx 2.0,控件基础事件handler必须接收一个继承自Event类的参数,并返回void。在JavaFX 2.1,参数的限制被取消,我们可以写一个无参数的控件事件handler。

* <fx:constant>标签

   我们可以在FXML中添加<fx:constant>标签来查找常量。比如,我们定义了名为NEGATIVE_INFINITY的Double类,现在引用它:

   <Double fx:constant="NEGATIVE_INFINITY"/>

* FXML中方便访问子控件

   在JavaFX 2.1及之前的版本,从根控件访问子控件并不是一件容易的事。

   JavaFX 2.2映射被嵌套的控件作为成员变量,使用它可以更方便与嵌套控件相互作用。

   <VBox fx:controller="com.foo.MainController">

   ...

<fx:include fx:id="dialog" source="dialog.fxml"/>

   ...

   </VBox>

   public class MainController extends Controller {

    @FXML private Window dialog;

@FXML private DialogController dialogController;

...

   }

Creating an Address Book with FXML

我们接下来创建一个包含名字和邮箱地址的表。并在表中填入数据,在启动时对数据排序,数据在单元格里自动对齐,增加新数据到表中。

在开始这个例子前,一些基础知识我们应该了解:

* FXML工程的基本结构(.java, .fxml, 和controller文件)

* 如何创建并运行FXML工程

* 基本的layout和UI控件

先来看看我们将要实现的工程运行结果是什么样子的


创建启动类----TableViewMain.java

public class TableViewMain extends Application{


@Override

public void start(Stage primaryStage) throws Exception {

primaryStage.setTitle("FXML TableView Example");

Pane myPane = FXMLLoader.load(getClass().getResource("tableview.fxml"));

Scene myScene = new Scene(myPane);

primaryStage.setScene(myScene);

primaryStage.show();

}


public static void main(String args[]){

launch(args);

}

}

建立layout并加入标签和表

<GridPane alignment="CENTER" hgap="10.0" vgap="10.0"

xmlns:fx="http://javafx.com/fxml"

fx:controller="example.fxml.tableview.TableViewController">


<padding>

<Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/>

</padding>


<Label style="-fx-font: NORMAL 20 Tahoma;" text="Address Book" GridPane.columnIndex="0" GridPane.rowIndex="0">

</Label>

<TableView fx:id="tableView" GridPane.columnIndex="0" GridPane.rowIndex="1">

<columns>

<TableColumn text="First Name"></TableColumn>

<TableColumn text="Last Name"></TableColumn>

<TableColumn text="Email Address"></TableColumn>

</columns>

</TableView>


</GridPane>

定义数据模型

public class Person {

private final SimpleStringProperty firstName = new SimpleStringProperty("");

private final SimpleStringProperty lastName = new SimpleStringProperty("");

private final SimpleStringProperty email = new SimpleStringProperty("");

public Person() {

this("", "", "");

}

public Person(String firstName, String lastName, String email) {

setFirstName(firstName);

setLastName(lastName);

setEmail(email);

}

public String getFirstName() {

return firstName.get();

}

public void setFirstName(String fName) {

firstName.set(fName);

}

public String getLastName() {

return lastName.get();

}

public void setLastName(String lName) {

lastName.set(lName);

}

public String getEmail() {

return email.get();

}

public void setEmail(String e) {

email.set(e);

}

}

将数据 与表关联起来

创建ObservableList数组

</columns>

<items>

<FXCollections fx:factory="observableArrayList">

<Person firstName="Jacob" lastName="Smith" email="jacob.smith@aa.com"/>

<Person firstName="Isabella" lastName="Johnson" email="isabella.johnson@aa.com"/>

<Person firstName="Ethan" lastName="Williams" email="ethan.williams@aa.com"/>

</FXCollections>

</items>

</TableView>

为每一殒指定一个单元格工厂将数据关联起来

<columns>

<TableColumn text="First Name">

<cellValueFactory>

<PropertyValueFactory property="firstName"/>

</cellValueFactory>

</TableColumn>

<TableColumn text="Last Name">

<cellValueFactory>

<PropertyValueFactory property="lastName"/>

</cellValueFactory>

</TableColumn>

<TableColumn text="Email Address">

<cellValueFactory>

<PropertyValueFactory property="email"/>

</cellValueFactory>

</TableColumn>

</columns>

引入所需的包

<?import javafx.scene.control.cell.PropertyValueFactory?>

<?import javafx.collections.*?>

<?import example.fxml.tableview.*?>

设定启动时排序

Add an ID to the First Name column:

<TableColumn fx:id="firstNameColumn" text="First Name">

Specify the sort order

</items>

<sortOrder>

<fx:reference source="firstNameColumn"/>

</sortOrder>

</TableView>

定义列宽度

<TableColumn fx:id="firstNameColumn" text="First Name" prefWidth="100">

### 关于JavaFX FXML 1.8教程及相关问题 JavaFX 是一种用于构建桌面应用程序的框架,而FXML是一种基于XML的语言,允许开发者通过声明的方式定义UI布局[^1]。对于初学者来说,了解如何集成FXML文件到Swing应用或者纯JavaFX项目是非常重要的。 #### 集成FXML文件至JavaFX项目的常见方式 为了在JavaFX中加载并使用FXML文件,可以采用`FXMLLoader`类来完成这一过程。下面是一个简单的例子展示如何加载一个名为`sample.fxml`的文件: ```java import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.Pane; import javafx.stage.Stage; import javafx.fxml.FXMLLoader; public class SampleApp extends Application { @Override public void start(Stage primaryStage) throws Exception { FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml")); Pane rootPane = (Pane) loader.load(); Scene scene = new Scene(rootPane); primaryStage.setScene(scene); primaryStage.setTitle("Sample JavaFX with FXML"); primaryStage.show(); } public static void main(String[] args) { launch(args); } } ``` 上述代码展示了如何利用`FXMLLoader`加载外部的FXML资源,并将其设置为主场景的一部分。 #### 官方文档支持 官方Oracle文档提供了丰富的学习路径以及针对不同层次开发者的指导材料[^2]。这些资料不仅涵盖了基础概念还深入探讨了高级特性如动画、媒体播放等。因此,在遇到具体技术难题时查阅官方指南通常是解决问题的有效途径之一。 #### 初学建议 如果刚接触Java平台,则可以从专门为新手设计的学习中心获取更多信息[^3]。这里包含了从安装环境配置到编写第一个程序等一系列入门级教学内容。 另外值得注意的是Kotlin语言也可以很好地同JavaFX配合工作[^4]。虽然原问题是关于Java版本下的实现细节讨论,但对于跨语言兴趣者而言这也提供了一种新的视角去审视相同的技术领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值