javafx 之 TableView

开发环境

【IntelliJ IDEA 2019.2 + jdk8】

先建一个基本工程

放置界面

先放一个Pane, 这是一个固定步骤,先要有一个容器,才能放TableView等其它控件。

放入TableView

若想增加列数,则加入TableColumn控件即可。

修改列名称:直接在右边的Properties --> Text 里输入新的名程即可。

添加数据

先填入一个 TableView的ID

然后,代码就可以根据这个ID,初始化变量,如下:

把Main.java里的代码改一下就行,其它的文件不用改。

Main.java如下:

package sample;

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;


public class Main extends Application {

    public javafx.scene.control.TableView m_TableView;
    public javafx.scene.control.TableColumn m_TableColumn_0;
    public javafx.scene.control.TableColumn m_TableColumn_1;
    public javafx.scene.control.TableColumn m_TableColumn_2;

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

    @SuppressWarnings({ "rawtypes", "unchecked" })
    @Override
    public void start(Stage primaryStage)  throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 500, 500));
        primaryStage.show();
        m_TableView = (javafx.scene.control.TableView)root.lookup("#Id_TableView_1");
        m_TableColumn_0 = (javafx.scene.control.TableColumn) m_TableView.getColumns().get(0);
        m_TableColumn_1 = (javafx.scene.control.TableColumn) m_TableView.getColumns().get(1);
        m_TableColumn_2 = (javafx.scene.control.TableColumn) m_TableView.getColumns().get(2);

        m_TableColumn_0.setCellValueFactory(new PropertyValueFactory<Object, Object>("Name")); // 这里是大小写不敏感。
        m_TableColumn_1.setCellValueFactory(new PropertyValueFactory<Object, Object>("value"));
        m_TableColumn_2.setCellValueFactory(new PropertyValueFactory<Object, Object>("Unit"));

        // 下面的代码可以重定义显示的格式,可以实现多行显示,等等,功能非常的强大。
        // 参考: https://blog.csdn.net/asdinto/article/details/91524452?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase
        m_TableColumn_2.setCellFactory(col->{
            TableCell<Object, Object/*Double*/> cell = new TableCell<Object, Object/*Double*/>(){
                @Override
                public void updateItem(Object/*Double*/ item, boolean empty) {
                    super.updateItem(item, empty);
                    this.setText(null);
                    this.setGraphic(null);
                    if (!empty) {
                        int rowIndex = this.getIndex();
                        //double d = tbView.getItems().get(rowIndex).getWage();
                        //this.setText(StringUtils.formatNumber(2, d));
                        String src = item.toString();
                        String dst = new String();
                        for (int i=0; i<src.length(); i+=10){
                            int len = 10;
                            if (i + len > src.length())len = src.length() - i;
                            dst += src.substring(i, i+len);
                            dst += "\n";
                        }
                        this.setText(dst);
                    }
                }
            };
            return cell;
        });

        // 第一种赋值法:
//        m_TableView.getItems().add(new Person("人速", "100", "米"));
//        m_TableView.getItems().add(new Person("马速", "高速度", "秒"));

        // 第二种赋值法:
        ObservableList<Person> data = FXCollections.observableArrayList(
                new Person("1", "张三", "米12345679456877455555aaaabbb"),
                new Person("2", "李四", "米"),
                new Person("3", "王五", "米")
        );
        m_TableView.setItems(data);
        data.get(0).setName("ooo");
    }

    // 这是我们数据里的对象--配角的配角
    public static class Person {
        private SimpleStringProperty Name;// 这里是大小写不敏感。
        private SimpleStringProperty value;
        private SimpleStringProperty Unit;
        private Person(String name_in, String value_in, String Unit_in) {
            this.Name = new SimpleStringProperty(name_in);
            this.value = new SimpleStringProperty(value_in);
            this.Unit = new SimpleStringProperty(Unit_in);
        }
        public String getName() {return Name.get();}
        public void setName(String name_in) {Name.set(name_in);}
        public String getValue() {return value.get();} // 变量在这里,头个字母必须大写。
        public void setValue(String value_in) {value.set(value_in);}
        public String getUnit() {return Unit.get();}
        public void setUnit(String Unit_in) {Unit.set(Unit_in);}
    }
}

以上代码参考自:《JavaFX+Jfoenix 学习笔记(三)--TableView数据表格源码》

https://download.csdn.net/download/qq_26486347/11389325?ops_request_misc=&request_id=&biz_id=103&utm_term=javafxtableview%E6%B7%BB%E5%8A%A0%E6%95%B0%E6%8D%AE&utm_medium=distribute.pc_search_result.none-task-download-2~download~sobaiduweb~default-3-11389325.pc_v2_rank_dl_default&spm=1018.2226.3001.4451

程序运行效果如下:

格子自动调整大小

有时候,字符串特别长,放不下,那么,这时,该怎么办呢?

 

上面的写法尽可能地利用fxml来画图,很方便,但是有一点不是很好,就是样式一旦固定后,后面修改的余地不大,也是说,灵活性会缺失一点,下面介绍一种纯代码的写法。

纯代码写法

 

 

 

 

posted on 2021-01-11 15:11  lizhuohui  阅读(1251)  评论(0编辑  收藏  举报

导航