JavaFX中高级控件和图表的探索
在JavaFX框架中,控件和图表的高级应用是构建复杂用户界面的关键。本章深入探讨了如何通过JavaFX的API来实现高级控件和图表的定制,特别是对于 ListView
和 TableView
的高级用法。
多选列表的实现
JavaFX提供了一套丰富的API,使得我们可以方便地实现多选列表。使用 SelectionMode.MULTIPLE
,可以轻松设置列表的多选模式。当列表项被选中或聚焦时,可以通过监听 selectedIndexProperty
来跟踪这些变化。
list.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
list.getSelectionModel().getSelectedItems();
list.getSelectionModel().selectedIndexProperty().addListener((obs) -> {
System.out.println("Selected: " + list.getSelectionModel().getSelectedItems());
System.out.println("Focused: " + list.getFocusModel().getFocusedItem());
});
可编辑列表的单元格工厂
为了使 ListView
支持编辑,JavaFX提供了 Cell Factories API
。 TextFieldListCell
允许用户双击列表项直接编辑值,而 ChoiceBoxListCell
和 ComboBoxListCell
则提供了预设值供用户选择。这些工厂的使用,使得创建一个可编辑的列表变得简单而直接。
list.setEditable(true);
list.setCellFactory(TextFieldListCell.forListView(new IntegerStringConverter()));
使用CheckBoxListCell创建待办事项列表
CheckBoxListCell
是一个较为复杂的单元格工厂,它可以为每个列表项添加一个复选框,非常适合创建待办事项列表。但需要注意的是,为了能够追踪内部状态的变化,我们需要通过提供一个提取器回调来扩展 ObservableList
的功能。
list.setCellFactory(CheckBoxListCell.forListView(item -> item.isDone));
自定义单元格的创建
除了标准的文本内容,我们还可以使用 setCellFactory
方法来创建自定义的单元格。例如,可以为每个列表项添加一个对应颜色的矩形。
list.setCellFactory((ListView<String> param) -> {
return new ListCell<>() {
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (!empty && item != null) {
setGraphic(new Rectangle(30, 30, Color.web(item)));
setText(item);
} else {
setText(null);
setGraphic(null);
}
}
};
});
使用TableView展示表格数据
TableView
是JavaFX中用于展示表格数据的重要控件。为了维护模型-视图连接,表格中的列表元素需要是包含数据的类的实例,并且每个元素都应该有对应的getter方法。
class Chapter {
private final String title;
private final int number;
// getters and setters
}
通过本章的学习,我们不仅学会了如何利用JavaFX的API来实现复杂用户界面的高级特性,而且也能够更好地理解如何组织数据和视图之间的关系,以及如何灵活地扩展和自定义界面组件以满足特定的需求。