Jap*_*eva 5 java listview javafx
我有一个listview,使用a CheckBoxListCell
来显示列表,其中包含项目旁边的复选框.如何向此复选框添加侦听器以了解项目何时被选中或未被选中?
jew*_*sea 12
解
您不会向该复选框添加侦听器.您可以通过CheckBoxListCell.forListView例程向该对象的observable属性添加一个侦听器,该对象与该复选框关联.
建立关联:
ListView<Task> checklist = new ListView<>(tasks);
checklist.setCellFactory(CheckBoxListCell.forListView(Task::selectedProperty));
Run Code Online (Sandbox Code Playgroud)
为所有项添加侦听器:
tasks.forEach(task -> task.selectedProperty().addListener((observable, wasSelected, isSelected) -> {
if (isSelected) {
// . . .
} else {
// . . .
}
}));
Run Code Online (Sandbox Code Playgroud)
文档
这个过程在CheckBoxListCell.forListView javadoc中描述如下:
getSelectedProperty
- 给定类型为T的对象(从ListView.items列表中取出的值)的回调函数,将返回一个ObservableValue,表示是否选择了给定的项目.此ObservableValue将双向绑定(意味着单元格中的CheckBox将根据用户交互设置/取消设置此属性,并且CheckBox将反映ObservableValue的状态,如果它在外部更改).
示例程序
一个示例程序,演示了一些可以与CheckBoxListCell一起使用的模式:
import javafx.application.Application;
import javafx.beans.property.*;
import javafx.collections.*;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.control.cell.CheckBoxListCell;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;
import java.util.*;
import java.util.stream.Collectors;
public class CheckList extends Application {
@Override
public void start(Stage stage) throws Exception{
ObservableList<Task> tasks = FXCollections.observableArrayList(
Arrays.stream(taskNames).map(Task::new).collect(Collectors.toList())
);
ListView<String> reactionLog = new ListView<>();
tasks.forEach(task -> task.selectedProperty().addListener((observable, wasSelected, isSelected) -> {
if (isSelected) {
reactionLog.getItems().add(reactionStrings.get(task.getName()));
reactionLog.scrollTo(reactionLog.getItems().size() - 1);
}
}));
ListView<Task> checklist = new ListView<>(tasks);
checklist.setCellFactory(CheckBoxListCell.forListView(Task::selectedProperty, new StringConverter<Task>() {
@Override
public String toString(Task object) {
return object.getName();
}
@Override
public Task fromString(String string) {
return null;
}
}));
HBox layout = new HBox(10, checklist, reactionLog);
layout.setPrefSize(350, 150);
layout.setPadding(new Insets(10));
Scene scene = new Scene(layout);
stage.setScene(scene);
stage.show();
}
public static class Task {
private ReadOnlyStringWrapper name = new ReadOnlyStringWrapper();
private BooleanProperty selected = new SimpleBooleanProperty(false);
public Task(String name) {
this.name.set(name);
}
public String getName() {
return name.get();
}
public ReadOnlyStringProperty nameProperty() {
return name.getReadOnlyProperty();
}
public BooleanProperty selectedProperty() {
return selected;
}
public boolean isSelected() {
return selected.get();
}
public void setSelected(boolean selected) {
this.selected.set(selected);
}
}
public static void main(String[] args) {
launch(args);
}
private static final String[] taskNames = {
"Walk the dog",
"Skin the cat",
"Feed the pig"
};
private static final Map<String, String> reactionStrings = new HashMap<>();
static {
reactionStrings.put("Walk the dog", "The dog thanks you");
reactionStrings.put("Skin the cat", "The cat hates you");
reactionStrings.put("Feed the pig", "The pig wants more");
}
}
Run Code Online (Sandbox Code Playgroud)
选择第一个项目一次和第三个项目三次后的样本输出.
归档时间: |
|
查看次数: |
6725 次 |
最近记录: |