22
2013
08

JavaFX中使用列表

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,里面放了一个标签,一个按钮,点击按钮即可删除列表此项的数据,列表会自动刷新。注意,跟数据删除、添加不同,如果列表某一项数据发生变化,列表是不会自动刷新构造的,需要给列表增加监听器才能实现,比较复杂,简单的方法就是把对应位置的数据删除,重新添加一次。


效果如图:

list.PNG

源码下载:

ListTest.zip


« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。