Java 如果使用不同的列选择了多行,请选择EditEMS empty
我在Java 如果使用不同的列选择了多行,请选择EditEMS empty,java,javafx,java-8,javafx-8,Java,Javafx,Java 8,Javafx 8,我在选择模式下有一个表格视图。多个。使用ListChangeListener我能够捕获多行的选择(按Shift)。 但是,我的解决方案仅适用于在同一列中选择项目或在没有列的区域中选择项目的情况。Gif以4个示例进行说明: 确定:使用“状态转换”列选择3项 确定:在Idx列中使用Shift键选择4项 确定:使用Shift键选择4个项目,从状态列到无列区域 错误:尝试使用从状态列到数据项列的Shift键选择4项 问题似乎是在上一个示例中,SelectedItems-列表显然是空的。我非常感谢你在这
选择模式下有一个表格视图
。多个
。使用ListChangeListener
我能够捕获多行的选择(按Shift)。但是,我的解决方案仅适用于在同一列中选择项目或在没有列的区域中选择项目的情况。Gif以4个示例进行说明:
SelectedItems
-列表显然是空的。我非常感谢你在这个问题上的帮助
我的做法如下:
ObservableList<DataRowModel> dataRows = FXCollections.observableArrayList();
dataRows.addAll(dataSetModel.getRows());
tableDataRow.setItems(dataRows);
tableDataRowStateColumn.setCellValueFactory(f -> f.getValue().getState());
tableDataRow.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
tableDataRow.getSelectionModel().getSelectedItems()
.addListener((ListChangeListener.Change<? extends DataRowModel> c) -> {
while (c.next()) {
c.getRemoved().stream().forEach(remitem -> remitem.setSelected(false));
c.getAddedSubList().stream().forEach(additem -> additem.setSelected(true));
System.out.println(c.getList()); //Empty [] when selected using different columns
}
});
我可以通过编辑Oracle的Person tableview示例来生成这个
这是一个bug,存档为,并在预计将于2015年8月发布的版本8u60中修复。虽然图像很好-最好是一个能证明问题的SSCCE:-)添加-删除了SSCCE中一些不必要的东西,以尽可能精简JavaFX代码:)我能够通过编辑Oracle的人员来生成这个tableview示例。此错误被归档为,并在8u60中修复。谢谢!我刚刚安装了早期的access版本,现在它就像一个符咒。我刚刚查阅了官方发布日期(GA),应该是2015年8月
import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;
public class TableViewSample extends Application {
private TableView<DataRowModel> tableDataRow = new TableView<DataRowModel>();
private TableColumn<DataRowModel, String> tableDataRowNameColumn = new TableColumn<>("Data Item");
private TableColumn<DataRowModel, String> tableDataRowStateColumn = new TableColumn<>("State");
private final ObservableList<DataRowModel> dataRows =
FXCollections.observableArrayList(
new DataRowModel("Concinna", false),
new DataRowModel("Concinna", false),
new DataRowModel("Concinna", false),
new DataRowModel("Concinna", false),
new DataRowModel("Concinna", false)
);
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle("Table View Sample");
stage.setWidth(500);
stage.setHeight(500);
tableDataRow.setItems(dataRows);
tableDataRowNameColumn.setCellValueFactory(f -> f.getValue().getName());
tableDataRowStateColumn.setCellValueFactory(f -> f.getValue().getState());
tableDataRow.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
tableDataRow.getSelectionModel().getSelectedItems()
.addListener((ListChangeListener.Change<? extends DataRowModel> c) -> {
while (c.next()) {
c.getRemoved().stream().forEach(remitem -> remitem.setSelected(false));
c.getAddedSubList().stream().forEach(additem -> additem.setSelected(true));
}
});
tableDataRow.getColumns().addAll(tableDataRowNameColumn, tableDataRowStateColumn);
((Group) scene.getRoot()).getChildren().addAll(tableDataRow);
stage.setScene(scene);
stage.show();
}
public static class DataRowModel {
private StringProperty name = new SimpleStringProperty(this, "name", "");
private BooleanProperty selected = new SimpleBooleanProperty(this, "selected", true);
private StringProperty state = new SimpleStringProperty(this, "state", "");
public DataRowModel(String name, boolean selected) {
this.name.setValue(name);
this.selected.setValue(selected);
this.selected.addListener((observable, oldVal, newVal) -> {
getState(); // Refresh State value
});
}
public StringProperty getName() {
return name;
}
public BooleanProperty isSelected() {
return selected;
}
public void setSelected(boolean selected) {
if (this.selected.getValue() != selected)
this.selected.setValue(selected);
}
public StringProperty getState() {
String stateStr = "";
if (selected.getValue())
stateStr += "Selected";
state.setValue(stateStr);
return state;
}
}
}