javafx 在tableView里插入checkbox

Posted alisonyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javafx 在tableView里插入checkbox相关的知识,希望对你有一定的参考价值。

在javafx中如何在tableView里面插入checkbox?在stackoverflow上有相关的回答http://stackoverflow.com/questions/7217625/how-to-add-checkboxs-to-a-tableview-in-javafx。

 



个人认为stackoverflow上的回复太过于繁琐,便提出一个新思路,就是在数据类里面加入一个checkbox,然后直接绑定。

 

首先定义一个封装了的CheckBox类

package App.Public.UI;

import javafx.beans.InvalidationListener;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.CheckBox;


public class checkbox
{
    CheckBox checkbox=new CheckBox();
    public ObservableValue<CheckBox> getCheckBox()
    {
        return new  ObservableValue<CheckBox>() {
            @Override
            public void addListener(ChangeListener<? super CheckBox> listener) {

            }

            @Override
            public void removeListener(ChangeListener<? super CheckBox> listener) {

            }

            @Override
            public CheckBox getValue() {
                return checkbox;
            }

            @Override
            public void addListener(InvalidationListener listener) {

            }

            @Override
            public void removeListener(InvalidationListener listener) {

            }
        };
    }
    public Boolean isSelected()
    {
        return checkbox.isSelected();
    }
}

我们要在table里面绑定的数据类型

package App.Model;

import App.Public.UI.checkbox;

public class person {
    public String name;
    public checkbox cb=new checkbox();
    public person(String name)
    {
        this.name=name;
    }
}

接着我们在controller类里面声明表格的类型

@FXML private TableView<person> table;
@FXML private TableColumn<person,String> name;
@FXML private TableColumn<person,CheckBox> checklist;

接着绑定数据

 @Override
    public void initialize(URL location, ResourceBundle resources) {
        ObservableList<person> data = FXCollections.observableArrayList(
                new person("1"),
                new person("2"),
                new person("3")
        );
        name.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().name) );   
        checklist.setCellValueFactory(cellData ->cellData.getValue().cb.getCheckBox());
        table.setItems(data);
    }
checklist.setCellValueFactory(cellData ->cellData.getValue().cb.getCheckBox());我们在这里调用封装了的checkbox的getCheckBox()方法,这里会返回一个ObservableValue<CheckBox>类型的checkbox


下一个问题是如何获得选中的对象?其实只需要获得数组,遍历一下他的checkbox是否被选中即可
这里是一个小例子
@FXML
    public void check()
    {
        ObservableList<person> list=table.getItems();
        for(person o:list)
        {
            if(o.cb.isSelected())
            {
                System.out.println(o.name);
            }
        }
    }

运行效果如下

点击button,触发check()函数,输出如下

 

以上是用了FXML来进行布局,不用FXML也是同理的,希望可以帮助到大家。

 

 

以上是关于javafx 在tableView里插入checkbox的主要内容,如果未能解决你的问题,请参考以下文章

在 CSS (JavaFX) 中为 TableView 设置样式

如何在 JavaFx TableView 中添加 TableView 页脚

JavaFX 9/10 不再可能覆盖 TableView.resizeColumnToFitContent

Javafx 8:在初始化方法中填充 TableView

如何在 JavaFX 中将 CheckBox 添加到 TableView

没有对象的 TableView 中的组合框 - JavaFX