首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JavaFX -使定制对象的ListView可编辑?

JavaFX是一个用于构建富客户端应用程序的开发工具包。它提供了丰富的图形化用户界面(GUI)组件和丰富的功能,使开发人员能够创建具有各种交互性和视觉效果的应用程序。

在JavaFX中,要使定制对象的ListView可编辑,可以通过以下步骤实现:

  1. 创建一个自定义的数据模型类,该类表示ListView中的每个对象。该类应该包含需要编辑的属性,并实现适当的getter和setter方法。
  2. 创建一个自定义的单元格编辑器类,该类继承自ListCell类,并重写startEdit()、cancelEdit()和commitEdit()方法。在startEdit()方法中,将单元格的文本设置为一个可编辑的文本字段或其他编辑组件。在cancelEdit()方法中,将单元格的文本重新设置为原始值。在commitEdit()方法中,将编辑后的值保存到数据模型中,并更新单元格的显示。
  3. 在ListView中,使用setCellFactory()方法设置单元格工厂。单元格工厂是一个回调函数,用于创建和配置每个单元格。在单元格工厂中,使用setOnEditStart()、setOnEditCancel()和setOnEditCommit()方法分别设置单元格的编辑开始、取消和提交事件的处理程序。在编辑开始事件处理程序中,调用startEdit()方法启动编辑模式。在编辑取消事件处理程序中,调用cancelEdit()方法取消编辑模式。在编辑提交事件处理程序中,调用commitEdit()方法提交编辑。

以下是一个示例代码,演示了如何使定制对象的ListView可编辑:

代码语言:java
复制
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class EditableListViewExample extends Application {

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

    @Override
    public void start(Stage primaryStage) {
        ListView<Person> listView = new ListView<>();
        listView.setEditable(true);

        // 设置单元格工厂
        listView.setCellFactory(param -> new EditableListCell());

        // 添加测试数据
        listView.getItems().addAll(
                new Person("John", 25),
                new Person("Jane", 30),
                new Person("Bob", 35)
        );

        VBox root = new VBox(listView);
        Scene scene = new Scene(root, 200, 200);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    // 自定义数据模型类
    public static class Person {
        private String name;
        private int age;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }

    // 自定义单元格编辑器类
    public static class EditableListCell extends ListCell<Person> {
        private TextField textField;

        @Override
        protected void updateItem(Person item, boolean empty) {
            super.updateItem(item, empty);

            if (empty || item == null) {
                setText(null);
                setGraphic(null);
            } else {
                if (isEditing()) {
                    setText(null);
                    setGraphic(textField);
                } else {
                    setText(item.getName());
                    setGraphic(null);
                }
            }
        }

        @Override
        public void startEdit() {
            super.startEdit();

            if (textField == null) {
                createTextField();
            }

            setText(null);
            setGraphic(textField);
            textField.selectAll();
        }

        @Override
        public void cancelEdit() {
            super.cancelEdit();

            setText(getItem().getName());
            setGraphic(null);
        }

        @Override
        public void commitEdit(Person item) {
            super.commitEdit(item);

            getItem().setName(textField.getText());
            setText(item.getName());
            setGraphic(null);
        }

        private void createTextField() {
            textField = new TextField(getItem().getName());
            textField.setOnAction(event -> commitEdit(getItem()));
            textField.focusedProperty().addListener((observable, oldValue, newValue) -> {
                if (!newValue) {
                    commitEdit(getItem());
                }
            });
        }
    }
}

这个示例演示了一个包含姓名的Person对象的ListView,可以通过双击单元格或按下F2键来启动编辑模式。编辑后的值将保存到数据模型中。

腾讯云相关产品和产品介绍链接地址:

请注意,以上链接仅为示例,具体的产品选择应根据实际需求和情况进行评估和选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券