首页 > 其他分享 >如何利用ObservableList为TableView添加Add和Del功能

如何利用ObservableList为TableView添加Add和Del功能

时间:2023-05-31 23:23:23浏览次数:34  
标签:TableView studentTableView javafx ObservableList Add new import

如何利用ObservableList为TableView添加Add和Del功能

TableView 的记录可以绑定到一个 ObservableList 。 ObservableList 是一种列表数据结构,继承自 List 。

很多 JavaFX 控件都可以用 ObservableList 管理动态数据。

利用 ObservableList 可以为 TableView 提供增加和删除数据的功能。

效果展示

image

示例代码

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TableViewExample extends Application
{
    public static class Student 
    {
        private String name;
        private int age;
    
        public Student(String name, int age)
        {
            this.name = name;
            this.age = age;
        }
    
        public String getName() { return name; }
        public int getAge() { return age; }
    }
    
    private TableView<Student> studentTableView;
    private ObservableList<Student> studentList;
    private TextField nameTextField;
    private TextField ageTextField;

    private void onSelectItem(Student item)
    {
        if (item != null)
        {
            System.out.println(String.format("name: %s, age: %d", item.getName(), item.getAge()));
        }
    }

    private void addStudent()
    {
        String name = nameTextField.getText();
        int age = Integer.parseInt(ageTextField.getText());

        Student student = new Student(name, age);
        studentList.add(student);

        nameTextField.clear();
        ageTextField.clear();
    }

    private void delStudent()
    {
        Student selectedItem = studentTableView.getSelectionModel().getSelectedItem();
        studentList.remove(selectedItem);
    }

    private void buildStudentTableView()
    {
        studentList = FXCollections.observableArrayList();

        studentTableView = new TableView<>();
        studentTableView.setItems(studentList);
        studentTableView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> onSelectItem(newValue) );
        
        TableColumn<Student, String> nameColumn = new TableColumn<>("Name");
        nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
        TableColumn<Student, String> ageColumn = new TableColumn<>("Age");
        ageColumn.setCellValueFactory(new PropertyValueFactory<>("age"));
        
        studentTableView.getColumns().add(nameColumn);
        studentTableView.getColumns().add(ageColumn);

        studentList.add(new Student("Tom", 21));
        studentList.add(new Student("Jim", 23));
        studentList.add(new Student("Micle", 18));
    }

    private HBox buildInputLayout()
    {
        HBox hBox = new HBox();
        hBox.setSpacing(10);
        
        nameTextField = new TextField();
        nameTextField.setPromptText("Name");
        nameTextField.setPrefWidth(100);
        ageTextField = new TextField();
        ageTextField.setPromptText("Age");
        ageTextField.setPrefWidth(100);

        Button addButton = new Button("ADD");
        addButton.setOnAction(e -> addStudent() );
        Button delButton = new Button("DEL");
        delButton.setOnAction(e -> delStudent() );

        hBox.getChildren().addAll(nameTextField, ageTextField, addButton, delButton);

        return hBox;
    }

    @Override
    public void start(Stage window) throws Exception
    {
        VBox vBox = new VBox();
        vBox.setPadding(new Insets(10));
        vBox.setSpacing(10);

        this.buildStudentTableView();
        vBox.getChildren().add(studentTableView);

        HBox inputLayout = this.buildInputLayout();
        vBox.getChildren().add(inputLayout);

        Scene scene = new Scene(vBox, 400, 300);

        window.setScene(scene);
        window.setTitle(this.getClass().getSimpleName());
        window.show();
    }

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

代码说明

下面的代码将 tableView 和 observableList 绑定到一起:

studentList = FXCollections.observableArrayList();

studentTableView = new TableView<>();
studentTableView.setItems(studentList);

之后,对 studentList 的修改将直接应用到 studentTableView 上。

通过 buildInputLayout 方法创建了一个输入的操作面板,并实现一个 ADD 功能和一个 DEL 功能。

总结

使用 ObservableList 动态管理 TableView 的步骤如下:

  1. 创建一个 ObservableList 对象,用于存储 TableView 的数据,并确保其泛型与 TableView 中的数据模型类型一致
  2. 调用 TableView 的 setItems() 方法将 ObservableList 与 TableView 进行绑定
  3. 在数据发生变化时,对 ObservableList 进行操作,这将自动反映在 TableView 中。可以使用 ObservableList 提供的方法,如 add() 和 remove() 来添加和删除数据

标签:TableView,studentTableView,javafx,ObservableList,Add,new,import
From: https://www.cnblogs.com/javafx-howto/p/17447628.html

相关文章

  • Could not autowire. No beans of 'AddressBookService' type found.
    错误:错误原因:Service实现类未继承Service接口解决方法: ......
  • 盒子模型content+border+padding+margin
    颜色赋值三原色RGBRedGreenBlue,每个颜色的取值范围0-255五种颜色赋值方式:颜色单词赋值:red/yellow/blue/pink....6位16进制赋值:#ff00003位16进制赋值:#f003位10进制赋值:rgb(255,0,0)4位10进制赋值:rgba(255,0,0,0-1)a=alpha 色彩空间:......
  • 百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 基于 Paddle Serving快速使用(服
    百度飞桨(PaddlePaddle)-PP-OCRv3文字检测识别系统预测部署简介与总览百度飞桨(PaddlePaddle)-PP-OCRv3文字检测识别系统PaddleInference模型推理(离线部署)百度飞桨(PaddlePaddle)-PP-OCRv3文字检测识别系统基于PaddleServing快速使用(服务化部署)PaddleServing......
  • 关于Addressable打包图集与图片都打进去造成冗余
    1)关于Addressable打包图集与图片都打进去造成冗余​2)Unity如何计算Root动画旋转3)IL2CPP编译的Protobuf反射类运行时报空4)为什么ActiveConstraints会出现过高的现象这是第337篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面......
  • 百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 预测部署简介与总览
    百度飞桨(PaddlePaddle)-PP-OCRv3文字检测识别系统预测部署简介与总览百度飞桨(PaddlePaddle)-PP-OCRv3文字检测识别系统PaddleInference模型推理(离线部署)百度飞桨(PaddlePaddle)-PP-OCRv3文字检测识别系统基于PaddleServing快速使用(服务化部署)1.预测部署简介......
  • 【2023 · CANN训练营第一季】——Ascend C算子代码分析—Add算子(内核调用符方式)
    前言:AscendC算子(TIKC++)使用C/C++作为前端开发语言,通过四层接口抽象、并行编程范式、孪生调试等技术,极大提高算子开发效率,助力AI开发者低成本完成算子开发和模型调优部署。学习完理论后,上代码,通过实践理解AscendC算子的概念,掌握开发流程,以及内核调用符方式的调试方法。一、算子分......
  • CMakeLists --- add_subdirectory 添加子目录
    命令格式:#添加一个子目录并构建该子目录。add_subdirectory(source_dir[binary_dir][EXCLUDE_FROM_ALL])#source_dir:子项目的CMakeLists.txt所在的目录#binary_dir:子项目产物的生成目录#EXCLUDE_FROM_ALL:不生成子项目的目标命令解析:source_dir必选参数。该参数指定......
  • nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)解决
    nginx:[emerg]bind()to0.0.0.0:80failed(98:Addressalreadyinuse)报错信息nginx:[emerg]bind()to0.0.0.0:80failed(98:Addressalreadyinuse)nginx:[emerg]socket()[::]:80failed(97:Addressfamilynotsupportedbyprotocol)定位方法1.先使用ps-e|......
  • [Error 10048] error while attempting to bind on address (‘127.0.0.1‘, 8000):
    今天运行程序的时候碰到了这么个问题,因为之前也遇到过这种情况,那时找不到原因重启电脑这方法偶尔能解决,今天就不行了,电脑又没有看到明显的占用这个端口的程序。所以查找资料从根源出发解决。解决方法是:1.进入命令行(以管理员身份)2.输入netstat-aon|findstr"8000"查找8000端......
  • Java中List用add方法出错
    由于在初始化的时候使用了List<实体类>aa=null;在添加List时使用aa.add(实体);报错空指针。原来初始化的时候需要List<实体类>aa=newArrayList();aa.add(实体);成功。或者将aa进行一次赋值,也可以正常使用List.add()这个方法......