首页 > 其他分享 >TornadoFx的TableView组件使用

TornadoFx的TableView组件使用

时间:2022-12-03 21:23:58浏览次数:60  
标签:readonlyColumn TableView fx TornadoFx Person rgba 组件 table 255

原文: TornadoFx的TableView组件使用 - Stars-One的杂货小窝

最近慢慢地接触了JavaFx中的TableView的使用,记下笔记总结

使用

1.基本使用

TornadoFx中对tableView进行了封装,我们只需要定义一个data class就可以使用其功能了(由于是Kotlin编写,所以没有兼容传统的Java类)

代码如下所示:


/**
 * Person
 *
 * @property name 姓名
 * @property age 年龄
 * @property type 类型 1:学生 2:老师
 * @constructor Create empty Person
 */
data class Person(var name: String, var age: Int, var type: Int)

class TableViewDemo : View() {

    val personList = observableListOf<Person>()

    override val root = vbox {
        setPrefSize(500.0,300.0)

        tableview(personList) {
            readonlyColumn("姓名",Person::name)
            readonlyColumn("年龄",Person::age)
            readonlyColumn("职位",Person::type)
        }

        personList.add(Person("张三", 12, 1))
        personList.add(Person("李四", 12, 2))
    }
}

显示效果:

2.调整表格列宽大小

这个实际比较简单, 修改prefWidth属性即可

tableview(personList) {
    readonlyColumn("姓名",Person::name){
        prefWidth = 200.0
    }
    readonlyColumn("年龄",Person::age)
    readonlyColumn("职位",Person::type)
}

效果:

3.修改单元格文本

上述由于我们的职位是使用1和2来定义,想要把此数值在TableView中显示为对应的文本,可以通过修改cellFormat{}函数中的text属性实现

示例代码如下:

tableview(personList) {
    readonlyColumn("姓名",Person::name){
        prefWidth = 200.0
    }
    readonlyColumn("年龄",Person::age)
    readonlyColumn("职位",Person::type){
        cellFormat {
            //这个it实际为当前行的对象的type属性
            val temp = if (it==1){
                "学生"
            }else{
                "老师"
            }
            text = temp
        }
    }
}

效果:

4.修改单元格节点Node

比如说我们想要加个操作一栏,然后单元格里不要显示文字,而是显示一个按钮或者其他组件等,可以通过cellFormat{}函数中的graphic属性来实现

示例代码如下:

tableview(personList) {
    readonlyColumn("姓名", Person::name) {
        prefWidth = 200.0
    }
    readonlyColumn("年龄", Person::age)
    readonlyColumn("职位", Person::type) {
        cellFormat {
            //这个it实际为当前行的对象的type属性
            val temp = if (it == 1) {
                "学生"
            } else {
                "老师"
            }
            text = temp
        }
    }
    readonlyColumn("操作", Person::type) {
        cellFormat {
            val button = button("测试") {
                action {
                    //当前行的数据对象
                    val item = items[index]
                    println(item)
                }
            }
            //设置单元格显示按钮
            graphic = button
        }
    }
}

效果:

5.空数据占位节点

通过tableview对象的placeholder属性来设置

class TableViewDemo : View() {

    val personList = observableListOf<Person>()

    override val root = vbox {
        setPrefSize(500.0, 300.0)

        tableview(personList) {
            readonlyColumn("姓名", Person::name) {
                prefWidth = 200.0
            }
            readonlyColumn("年龄", Person::age)
            readonlyColumn("职位", Person::type) {
                cellFormat {
                    //这个it实际为当前行的对象的type属性
                    val temp = if (it == 1) {
                        "学生"
                    } else {
                        "老师"
                    }
                    text = temp
                }
            }
            readonlyColumn("操作", Person::type) {
                cellFormat {
                    val button = button("测试") {
                        action {
                            //当前行的数据对象
                            val item = items[index]
                            println(item)
                        }
                    }
                    //设置单元格显示按钮
                    graphic = button
                }
            }
            //设置占位节点
            placeholder =tablePlaceNode()
        }
        //显示空数据,注释掉数据添加逻辑
        //personList.add(Person("张三", 12, 1))
        //personList.add(Person("李四", 12, 2))
    }

    //这里方便管理,就抽取封装成一个方法了
    private fun tablePlaceNode(): VBox {
        return vbox{
            alignment  = Pos.CENTER
            imageview("my_no_data.png"){
                fitWidth = 200.0
                fitHeight = 200.0
            }
            label("暂无数据")
        }
    }
}

效果:

至于其他的,类似多选,右键出现菜单,单元格可显示输入框输入等逻辑,目前没怎么用到,暂时就省略不写了,有时间再来补充了

各位想要实现的话可以查看下TornadoFx的文档研究

补充-css美化

.table-view {
    -fx-selection-bar: rgba(255, 255, 255, 1);
    -fx-selection-bar-non-focused: rgba(255, 255, 255, 1);
    -fx-border-color: rgba(193, 197, 205, 1) rgba(193, 197, 205, 1) rgba(193, 197, 205, 1) rgba(193, 197, 205, 1);
    -fx-border-width: 1px 1px 1px 1px;
    -fx-background-insets: 0px 0px 0px 0px;
}
.table-view .column-header {
    -fx-background-color: rgba(255, 255, 255, 1);
    -fx-padding: 10px 5px 5px 5px;
    -fx-border-color: rgba(235, 238, 245, 1) rgba(235, 238, 245, 1) rgba(235, 238, 245, 1) rgba(235, 238, 245, 1);
    -fx-border-width: 0px 0.5px 0px 0.5px;
}
.table-view .filler {
    -fx-background-color: rgba(255, 255, 255, 1);
}
.table-view .table-row-cell {
    -fx-border-color: rgba(235, 238, 245, 1) rgba(235, 238, 245, 1) rgba(235, 238, 245, 1) rgba(235, 238, 245, 1);
    -fx-border-width: 0.5px 0px 0.5px 0px;
}
.table-view .table-row-cell:odd {
    -fx-background-color: rgba(250, 250, 250, 1);
}
.table-view .table-row-cell:hover {
    -fx-background-color: rgba(245, 247, 250, 1);
}
.table-view .table-row-cell:selected {
    -fx-background-color: rgba(236, 245, 255, 1);
}
.table-view .table-row-cell:selected .text {
    -fx-fill: rgba(0, 0, 0, 1);
}
.table-view .table-cell {
    -fx-padding: 10px 10px 10px 10px;
    -fx-font-size: 13px;
}
.table-view .table-cell:selected {
    -fx-text-fill: rgba(0, 0, 0, 1);
}
.table-view:focused {
    -fx-border-color: rgba(50, 150, 255, 1) rgba(50, 150, 255, 1) rgba(50, 150, 255, 1) rgba(50, 150, 255, 1);
}

css来自chenfei-javafx-css: javafx css 美化

importStylesheet("/css/tableview.css")

效果:

参考

标签:readonlyColumn,TableView,fx,TornadoFx,Person,rgba,组件,table,255
From: https://www.cnblogs.com/stars-one/p/16948786.html

相关文章

  • vue中单独封装elementui中的Dialog弹框组件
    一。在components文件中新建弹框组件<template><div><el-dialogtitle="提示":visible.sync="dialogVisible"width="30%"@close="handleClose"><span......
  • 在子线程中更新UI组件
    androidUI界面更新UI线程属于主线程,当涉及到需要更新UI组件的问题时,需要在主线程中更新,另起线程会出现线程崩溃,当子线程需要修改主线程的UI组件时,需要通过发送消息来进......
  • SwiftUI 常见组件示例
    基础组件TextText("Hamlet").font(.largeTitle)Text("byWilliamShakespeare").font(.caption).italic()ImageHStack{Image(systemName:"fol......
  • Stemciljs学习2、组件生命周期
    组件有许多生命周期方法,可用于了解组件何时“将”和“执行”加载、更新和呈现。可以将这些方法添加到组件中,以便在正确的时间挂接到操作中。在组件类中实现以下方法之一,St......
  • k8s篇-k8s集群架构及组件详解【史上最详细】
    Okubernetes简介k8s是什么k8s是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可以促进声明式配置和自动化。k8s能做什么1)服务发现和负载......
  • K8S 核心组件 kubelet 与 kube-proxy 分析
    kubeletkubelet进程用于处理master下发的任务,管理pod中的容器,注册自身所在的节点.节点管理启动参数说明--register-node#如果设置为true则会向apiserver......
  • Flutter不常用组件(三)
    IntrinsicHeight创建一个将其子级大小调整为子级固有高度的小部件。它有以下几个属性:Key?key:标识键Widget?child:子组件如果我们有以下布局界面:Card(child:Ro......
  • React类组件写法与函数式组件写法
    React组件写法classMyButtonextendsReact.Component{constructor(props){//继承父类的构造函数super(props);this.state={openStatus:false}}}render(){retur......
  • 组件化与模块化
    单文件组件创建项目在cmd输入npminitvite-appvue3_demovue3_demo是文件夹名(项目名)在vscode中打开,开发项目写代码都在src目录下面写再进入项目中下载依赖npmi......
  • SignalR循序渐进(三)简易的集群通讯组件
    上一篇演示了泛型Hub的实现,微软于6月17日更新了SignalR2.1.0,然后自带了泛型Hub,于是就不需要自己去实现了…(微软你为啥不早一个月自带啊…)。不过没关系,SignalR出彩之处不在......