JavaFX TableView 编辑而不是编辑

标签 java javafx tableview

在 JavaFX 8 中,我试图在将新行添加到表格后编辑一个单元格,以优化用户体验。

    hourTableView.getSelectionModel().select(newHour);
    int row = hourTableView.getSelectionModel().getSelectedIndex();
    hourTableView.edit(row, hourTableAmountTableColumn);

选择了正确的行,但单元格未进入编辑模式。嗯,我曾偶然看到过这种情况,但很难重现。我做错了什么?

最佳答案

如果您想在刚刚插入的行上开始编辑,则该表的行为会很奇怪。我可以毫无问题地开始编辑任何行。但新添加的行并未按预期工作。我用一个线程延迟了编辑调用,然后它起作用了...... 请参阅以下示例代码:

import javafx.application.Application;
import javafx.application.Platform;
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.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class jfxtest extends Application {

    private ObservableList<Person> data;
    private TableView<Person> tableView;
    private TableColumn<Person, String> firstNameCol;

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        Button addButton = new Button("add new row");
        addButton.setOnMouseClicked(event -> addRow());
        VBox vbox = new VBox(addButton, createContent());
        primaryStage.setScene(new Scene(vbox));
        primaryStage.show();
    }

    private void addRow() {
        data.add(new Person("peter", "parker", "spiderman@aol.com"));
        new Thread(() -> {
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Platform.runLater(() -> {
                int row = data.size() - 1;
                tableView.getSelectionModel().select(row);
                tableView.getSelectionModel().focus(row);
                tableView.edit(row, firstNameCol);
            });
        }).start();
    }

    private TableView createContent() {
        data = FXCollections.observableArrayList(
            new Person("Jacob", "Smith", "jacob.smith@example.com"),
            new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
            new Person("Ethan", "Williams", "ethan.williams@example.com"),
            new Person("Emma", "Jones", "emma.jones@example.com"),
            new Person("Michael", "Brown", "michael.brown@example.com")
        );
        firstNameCol = new TableColumn<>("First");
        firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));
        firstNameCol.setEditable(true);
        firstNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
        firstNameCol.setOnEditCommit(
            t -> t.getTableView().getItems().get(
                t.getTablePosition().getRow()).firstNameProperty().setValue(t.getNewValue())
        );

        TableColumn<Person, String> lastNameCol = new TableColumn<>("Last");
        lastNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName"));

        TableColumn<Person, String> emailCol = new TableColumn<>("Email");
        emailCol.setCellValueFactory(new PropertyValueFactory<>("email"));

        tableView = new TableView<>();
        tableView.setEditable(true);
        tableView.setItems(data);
        tableView.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
        return tableView;
    }


    public class Person {
        private StringProperty firstName;
        private StringProperty lastName;
        private StringProperty email;

        Person(String fName, String lName, String email) {
            this.firstName = new SimpleStringProperty(fName);
            this.lastName = new SimpleStringProperty(lName);
            this.email = new SimpleStringProperty(email);
        }

        public StringProperty firstNameProperty() {
            return firstName;
        }

        public StringProperty lastNameProperty() {
            return lastName;
        }

        public StringProperty emailProperty() {
            return email;
        }
    }
}

关于JavaFX TableView 编辑而不是编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44484813/

相关文章:

java - 为什么 JavaFX TableView#setItems 采用 ObservableList<T> 而不是 ObservableList<?扩展 T>?

ios - NSAttributedString 在 tableViewCell 中滚动不流畅(消失/重新出现)

java - 更改 Web 应用程序语言

java - 计算差异。两次之间,因为我们有两个不同的时间和日期字符串

javafx-2 - 如何设置文本对齐方式

java - 我是否必须阻止循环操作处理程序调用

java - 使用 Rascal 从 Eclipse 项目中提取静态字段

java - 在 Java 中处理 SIGCHLD 信号

java - 有没有办法在没有事件处理程序的情况下等待按钮点击?

ios - Swift:使用 tableview 创建无限树