JavaFX中的列表使用起来相对复杂一些,不过功能很强大,包括ComboBox、ListView等,基本功能都是列表,构建方式也大致相同,这里以ListView为例做简单介绍。
定义列表控件:
ListView<String> listView = new ListView<String>(); |
泛型里定义了该列表保存的数据类型。
定义和设置构建列表的数据:
ObservableList<String> items = FXCollections.observableArrayList(); items.addAll("Libgdx", "Unity3D", "Cocos2d", "Jpct", "Angle"); listView.setItems(items); |
ObservableList跟ArrayList功能类似,设置给控件以后,控件会监听该列表的添加、删除等行为并在界面上做出相应处理。也就是说,上面代码中的列表定义好以后,我们随时增改items的数据,列表控件会自动刷新。
设置列表控件每一项的布局:
虽然上面我们只简单地给列表设置了字符串作为数据,但我们不希望列表每一项只显示个字符串这么简单。要实现列表项自定义布局,这里要给ListView构建并设置一个列表元素构造对象。
listView.setCellFactory(new Callback<ListView<String>, ListCell<String>>() { @Override public ListCell<String> call(ListView<String> list) { return new CustomListCell(JavaFxTestMain.this); } }); |
class CustomListCell extends ListCell<String> { private JavaFxTestMain main;
public CustomListCell(JavaFxTestMain main) { this.main = main; }
@Override public void updateItem(final String item, boolean empty) { super.updateItem(item, empty); if (item != null) { HBox hbox = new HBox(10); hbox.setAlignment(Pos.CENTER); Label label = new Label(item); Button button = new Button("删除" + item); button.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) { main.deleteListItem(item); } });
hbox.getChildren().addAll(label, button); setGraphic(hbox); } } } |
如你所见,这里继承了ListCell类,实现了自定义列表项的布局,覆盖了updateItem方法,item参数就是列表对应的数据。我在列表项的布局构建了一个HBox,里面放了一个标签,一个按钮,点击按钮即可删除列表此项的数据,列表会自动刷新。注意,跟数据删除、添加不同,如果列表某一项数据发生变化,列表是不会自动刷新构造的,需要给列表增加监听器才能实现,比较复杂,简单的方法就是把对应位置的数据删除,重新添加一次。
效果如图:
源码下载:
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。