为什么ListView多选模型自动更新

时间:2016-10-28 06:33:58

标签: listview javafx

我正在学习JavaFX ListView我想知道为什么当我选择listViewRight的项目时listViewLeft项会自动更新?

FXML代码:

<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.ListView ?>
<?import javafx.scene.control.Label ?>
<?import javafx.scene.control.SelectionMode ?>
<?import javafx.scene.control.MultipleSelectionModel ?>
<?import javafx.scene.control.CheckBox ?>
<?import javafx.collections.FXCollections ?>
<?import java.lang.String ?>
<BorderPane prefWidth="600" prefHeight="250" xmlns:fx="http://javafx.com/fxml" fx:controller="ListViewController">
    <left>
        <ListView fx:id="listViewLeft" editable="true">
            <items>
                <FXCollections fx:id="collection" fx:factory="observableArrayList">
                    <String fx:value="Good" />
                    <String fx:value="Bad" />
                    <String fx:value="Average" />
                </FXCollections>
            </items>
        </ListView>
    </left>

    <right>
        <ListView fx:id="listViewRight" />
    </right>
</BorderPane>

控制器代码:

import javafx.fxml.FXML;
import javafx.scene.control.ListView;
import javafx.scene.control.CheckBox;
import javafx.scene.control.SelectionMode;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.beans.value.ObservableValue;
import javafx.beans.value.ChangeListener;

public class ListViewController{
    @FXML private ListView<String> listViewLeft;
    @FXML private ObservableList<String> collections;
    @FXML private CheckBox newItem;
    @FXML private ListView<String> listViewRight;

    public void initialize(){
        collections = listViewLeft.getItems();
        listViewLeft.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);


        listViewRight.setItems(listViewLeft.getSelectionModel().getSelectedItems());
    }
}

当我从listViewLeft中选择项目时,该项目会自动显示到listViewRight为什么?我刚刚调用listViewLeft.getSelectionModel().getSelectedItems()将所有选定的项目添加到listViewRight,为什么binds添加到listViewRight

2 个答案:

答案 0 :(得分:1)

您应该阅读(https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/ListView.html)的 ListView JavaFX 8文档。对于您的问题,请查看以下部分:

  

填充ListView

     

此处显示了如何创建和填充名称ListView(字符串)的简单示例:

ObservableList<String> names = FXCollections.observableArrayList("Julia", "Ian", "Sue", "Matthew", "Hannah", "Stephan", "Denise");
ListView<String> listView = new ListView<String>(names);
  

ListView的元素包含在ObservableList项中。 ListView会自动观察此ObservableList,因此ObservableList中发生的任何更改都将自动显示在ListView本身中。如果将ObservableList传递给ListView构造函数是不可行的,那么设置项目的推荐方法是简单地调用:

ObservableList<T> content = ...
listView.setItems(content);
  

如上所述,最终结果是ListView将自动刷新视图以表示列表中的项目。   另一种方法虽然被ListView接受,但不是推荐的方法:

List<T> content = ...
getItems().setAll(content);

所以你想要的是不推荐的方法。要测试,请更改代码

listViewRight.setItems(listViewLeft.getSelectionModel().getSelectedItems());

listViewRight.getItems().setAll(listViewLeft.getSelectionModel().getSelectedItems());

答案 1 :(得分:1)

“支持列表”

ListView引用了ObservableList,您可以通过getItems()访问该ObservableList; ObservableList包含列表视图中显示的元素。 ListView有时被称为ListView的“支持列表”(我将在此处执行此操作)。

ListView向后备列表注册侦听器,以便在列表内容发生更改时更新列表视图。

ListView(两种不同的方式)

更改项目

有两种方法可以更改listView.getItems().setAll(someCollection); 显示的项目。您可以更改支持列表的内容。例如:

listView.setItems(someObservableList);

将删除当前在支持列表中的所有项目,并将其替换为所提供集合中的所有项目。

或者,您可以完全提供新的支持列表:

ListView

这将告诉someObservableList使用ListView作为其支持列表。它将删除它在当前支持列表中注册的任何侦听器,将侦听器添加到您提供的列表中,并且您提供的列表的内容将成为列表视图的内容。

ObservableList

中的所选项目

选择模型通过listView.getSelectionModel().getSelectedItems()公开包含列表中所选项目的ListView。当用户选择或取消选择列表视图中的项目时,ObservableList会自动更新此列表。由于这是listViewRight.setItems(listViewLeft.getSelectionModel().getSelectedItems()); ,您可以使用它注册监听器,以便在其内容发生变化时(即选择或取消选择项目时)收到通知。

您的代码的作用

因此,在您提供的代码中,您可以:

listViewRight

这告诉listViewLeft使用listViewLeft.getSelectionModel().getSelectedItems() 中所选项目的列表作为其支持列表。即如果ListView的内容发生变化,那么listViewRight.getItems().setAll(listViewLeft.getSelectionModel().getSelectedItems()); 的内容会发生变化:这就是支持列表的目的。

另一方面,如果你已经完成了

listViewRight

您已将listViewLeft当前支持列表的内容替换为listViewLeft中的所选项目(即您将清除支持列表并将listViewLeft.getSelectionModel().getSelectedItems()中的所选项目复制到支持清单)。在这种情况下,listViewRight的后续更改不会反映在# 15+ different categories... APPLICANT_TYPES = ["primary", "coborrower"].freeze # forms... <%= f.select :applicant_type, APPLICANT_TYPES %> # models... class Applicant < ApplicationRecord validates :applicant_type, inclusion: { in: APPLICANT_TYPES } end 的支持列表中。