我正在学习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
?
答案 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
的支持列表中。