当前位置: 首页 > 知识库问答 >
问题:

JavaFX TableView编辑不编辑

司马璞
2023-03-14

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

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

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

共有2个答案

夹谷斌蔚
2023-03-14

在JavaFX TableView中的插入行中找到解决方案并开始编辑无法正常工作

您需要调用<code>hourTableView。layout(),然后调用hourTableView.edit()<-code>。当新行不可见时,情况变得更加复杂,我发现hourTableView。如果在hourTableView.layout()之前调用scrollTo()<-code>,则会有所帮助。

商正浩
2023-03-14

如果要开始对刚插入的行进行编辑,该表的行为会很奇怪。我可以毫无问题地开始编辑任何行。但新添加的行没有按预期工作。我用一个线程延迟了编辑调用,然后它工作了…请参见下面的示例代码:

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;
        }
    }
}
 类似资料:
  •   复制 剪切 字符 y x 行 yy dd 需先在可视模式中选取 p 在光标后粘贴 P 在光标前粘贴 u 撤消 Ctrl+r 重做 Ctrl+y 逐字克隆上一行内容 Ctrl+e 逐字克隆下一行内容

  • 问题内容: 使用什么是能够编辑内容的最佳方法? 在我理想的情况下, 添加的 生日将是一个超链接,点击该链接将显示一个编辑表单-与带有更新按钮的当前添加表单相同。 实时预览(插播) HTML: App.js: 问题答案: 您应该将表单放在每个节点内,分别使用和启用和禁用编辑。像这样: 这里的关键点是: 我已将控件更改为本地范围 已添加到,因此我们可以在编辑时显示它 添加了带有的,以便在编辑时隐藏内容

  • Vim提供了许多命令,使编辑功能非常强大。 在本章中,将讨论以下主题内容 - 插入 附加 打开新行 替换 更改 更换 加入 1. 在光标前插入文本 要在光标之前插入文本执行以下步骤 - 打开Vim 切换到插入模式 在行的开头插入文本 假设位于行的中间,并且希望在当前行的开头插入文本,然后执行以下步骤 - 切换到命令模式 激活插入模式 此操作将光标移动到当前行的开头并在插入模式下切换Vim。 在光标

  • 概述 Sublime Text 有非常多的编辑功能,这里只能介绍一点皮毛。 多文本选择 多文本选择让你高效地修改文本,任何的赞美都无法形容它了,原因: 选择一些文本,按下Ctrl+D进行多选,如果想跳过当前项,按下Ctrl+K,Ctrl+D。 误选了按Ctrl+U撤销最后一次选中项。 多行选择合并成一行 Ctrl+L选中单行文本,Ctrl+Shift+L把多行选择变成单行选择的编辑状态。 列选择

  • 复制、粘贴、选择、查找、替换应该是我们在编写代码时最常用的操作了,Android Studio可以让这些操作变得简单和高效。

  • 基础 安装 扩展市场 任务 调试 为什么选用VSCode 版本控制 易用性 与时俱进的编辑体验