gpt4 book ai didi

java - 以编程方式更改排序列后,光标键在带有 setCellSelectionEnabled 的 TableView 中不起作用

转载 作者:行者123 更新时间:2023-12-01 09:44:54 24 4
gpt4 key购买 nike

这要么是 TableView 中的错误(我的配置:Win7、64 位、jdk1.8.0_60),要么是我的操作方式错误。

如果我在 tableView 上调用 setCellSelectionEnabled(true) 以便能够选择单个单元格,然后调用 table.getSortOrder().setAll(idColumn) 进行更改以编程方式对列进行排序,光标键停止工作,直到我用鼠标单击 tableView。调用 table.getSelectionModel().select(selectedRow, selectedColumn) 也有帮助,但我花了 2 天才发现它似乎不对。

请使用下面的 SSCCE 和以下步骤来重现该问题:

  1. 运行下面的类
  2. 按光标键查看它们是否有效
  3. 按 F2 按名字列排序
  4. 使用光标键查看它们不再起作用
  5. 点击tableView中一些未选中的单元格
  6. 按光标键查看它们再次工作
  7. 按 F1 使用 ID 排序
  8. 使用光标键查看他们不再工作
  9. 按 F3 按姓氏列排序
  10. 按光标键可以看到它们再次工作,因为这就是我调用table.getSelectionModel().select(selectedRow, selectedColumn)的地方

这是一个错误还是只是我的问题?

谢谢!

import java.util.Arrays;

import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TablePosition;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class TableViewTest extends Application {

private TableView<Person> table;
private TableColumn<Person, Integer> idColumn;
private TableColumn<Person, String> firstNameColumn;
private TableColumn<Person, String> lastNameColumn;

//------------------------------------------------------
@Override
public void start(Stage primaryStage) {
final BorderPane root = new BorderPane();

table = new TableView<>();
table.setItems(createData());

idColumn = new TableColumn<>("ID");
firstNameColumn = new TableColumn<>("First Name");
lastNameColumn = new TableColumn<>("Last Name");

idColumn.setCellValueFactory(new PropertyValueFactory<>("id"));
firstNameColumn.setCellValueFactory(new PropertyValueFactory<>("firstName"));
lastNameColumn.setCellValueFactory(new PropertyValueFactory<>("lastName"));

table.setOnKeyReleased(this::tableKeyEvent);

table.getSelectionModel().setCellSelectionEnabled(true);

table.getColumns().addAll(Arrays.asList(idColumn, firstNameColumn, lastNameColumn));

root.setCenter(table);

primaryStage.setOnShown(windowEvent -> {
table.getSelectionModel().select(0, idColumn);
table.requestFocus();
});

final Scene scene = new Scene(root, 400, 600);
primaryStage.setScene(scene);
primaryStage.show();

}

//------------------------------------------------------
private void tableKeyEvent(KeyEvent e) {
if (e.getCode() == KeyCode.F1) {
table.getSortOrder().setAll(idColumn);
}
if (e.getCode() == KeyCode.F2) {
table.getSortOrder().setAll(firstNameColumn);
}
if (e.getCode() == KeyCode.F3) {
table.getSortOrder().setAll(lastNameColumn);

TablePosition selectedPosition = table.getSelectionModel().getSelectedCells().get(0);
int selectedRow = selectedPosition.getRow();
TableColumn selectedColumn = selectedPosition.getTableColumn();

table.getSelectionModel().select(selectedRow, selectedColumn);
}
}


//------------------------------------------------------
public static void main(String[] args) {
launch(args);
}

//------------------------------------------------------
/* HUGE THANKS to the random name generator at: http://random-name-generator.info/random/?n=100&g=1&st=2
It saved my sanity! ;-) */
private ObservableList<Person> createData() {
return FXCollections.observableArrayList(
new Person(0, "Brendan", "Carter"),
new Person(1, "Karl", "Page"),
new Person(2, "Jane", "Zimmerman"),
new Person(3, "Katrina", "Mcbride"),
new Person(4, "Natalie", "Howard"),
new Person(5, "Jeremiah", "Bishop"),
new Person(6, "Tricia", "Norman"),
new Person(7, "Dorothy", "Medina"),
new Person(8, "Leslie", "Clayton"),
new Person(9, "Ernestine", "Gibbs"),
new Person(10, "Donald", "Fuller"),
new Person(11, "Barbara", "Mendez"),
new Person(12, "Jeff", "Keller"),
new Person(13, "Zachary", "Sanchez"),
new Person(14, "Joyce", "Payne"),
new Person(15, "Neil", "Paul"),
new Person(16, "Amanda", "Patton"),
new Person(17, "Roosevelt", "Rios"),
new Person(18, "Hazel", "Wheeler"),
new Person(19, "Ramona", "Jensen"),
new Person(20, "James", "Berry"));
}

//------------------------------------------------------
public static class Person {
private final IntegerProperty id;
private final StringProperty firstName;
private final StringProperty lastName;

Person(Integer id, String firstName, String lastName) {
this.id = new SimpleIntegerProperty(this, "id", id);
this.firstName = new SimpleStringProperty(this, "firstName", firstName);
this.lastName = new SimpleStringProperty(this, "lastName", lastName);
}

public Integer getId() {
return id.get();
}

public void setId(Integer id) {
this.id.set(id);
}

public IntegerProperty idProperty() {
return id;
}

public String getFirstName() {
return firstName.get();
}

public void setFirstName(String firstName) {
this.firstName.set(firstName);
}

public StringProperty firstNameProperty() {
return firstName;
}

public String getLastName() {
return lastName.get();
}

public void setLastName(String lastName) {
this.lastName.set(lastName);
}

public StringProperty lastNameProperty() {
return lastName;
}

@Override
public String toString() {
return id.get() + " - " + firstName.get() + " " + lastName.get();
}

}
}

最佳答案

我既不能确认也不能反驳这是一个错误,因为文档对此没有任何说明。不过我可以确定原因:

焦点单元格的TableColumn 变为null

以下是 tableKeyEvent 方法的修改版本,它演示了该问题(打印焦点列)并应用了解决方法。

private void tableKeyEvent(KeyEvent e) {
TableColumn refocusColumn = null;

if (e.getCode() == KeyCode.F1) {
refocusColumn = table.getFocusModel().getFocusedCell().getTableColumn();
table.getSortOrder().setAll(idColumn);
}
if (e.getCode() == KeyCode.F2) {
refocusColumn = table.getFocusModel().getFocusedCell().getTableColumn();
table.getSortOrder().setAll(firstNameColumn);
}
if (e.getCode() == KeyCode.F3) {
table.getSortOrder().setAll(lastNameColumn);

TablePosition selectedPosition = table.getSelectionModel().getSelectedCells().get(0);
int selectedRow = selectedPosition.getRow();
TableColumn selectedColumn = selectedPosition.getTableColumn();

table.getSelectionModel().select(selectedRow, selectedColumn);
}
if (refocusColumn != null) {
// print focused column for "debugging"
System.out.println(table.getFocusModel().getFocusedCell().getTableColumn());

// focus previously focused column again to fix issue
table.getFocusModel().focus(table.getSelectionModel().getSelectedIndex(), refocusColumn);
}
}

关于java - 以编程方式更改排序列后,光标键在带有 setCellSelectionEnabled 的 TableView 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38145454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com