JavaFX-TableView详解

前言

最近在着手一个学生管理系统的编写,涉及到TableView的使用,这前前后后的也有了些经验和想法想要记录和分享一下(事实上我正在想要用html网页代替界面),更多的是学习之用。

先看看TableView中有些什么

在IDEA中,按住Ctrl然后点中TableView关键字会自动跟进到它定义的地方,我们可以先看看这里面到底都有些什么东西。

你会比较先的看到它的两个构造函数:

// 第一个构造函数
public TableView() {
    this(FXCollections.<S>observableArrayList());
}

// 第二个构造函数
public TableView(ObservableList<S> items) {
    getStyleClass().setAll(DEFAULT_STYLE_CLASS);
    setAccessibleRole(AccessibleRole.TABLE_VIEW);

    // we quite happily accept items to be null here
    setItems(items);

    // install default selection and focus models
    // it's unlikely this will be changed by many users.
    setSelectionModel(new TableViewArrayListSelectionModel<S>(this));
    setFocusModel(new TableViewFocusModel<S>(this));

    // we watch the columns list, such that when it changes we can update
    // the leaf columns and visible leaf columns lists (which are read-only).
    getColumns().addListener(weakColumnsObserver);

    // watch for changes to the sort order list - and when it changes run
    // the sort method.
    getSortOrder().addListener((ListChangeListener<TableColumn<S, ?>>) c -> {
        doSort(TableUtil.SortEventType.SORT_ORDER_CHANGE, c);
    });

    // We're watching for changes to the content width such
    // that the resize policy can be run if necessary. This comes from
    // TreeViewSkin.
    getProperties().addListener(new MapChangeListener<Object, Object>() {
        @Override
        public void onChanged(Change<? extends Object, ? extends Object> c) {
            if (c.wasAdded() && SET_CONTENT_WIDTH.equals(c.getKey())) {
                if (c.getValueAdded() instanceof Number) {
                    setContentWidth((Double) c.getValueAdded());
                }
                getProperties().remove(SET_CONTENT_WIDTH);
            }
        }
    });

    isInited = true;
}

可以大致的看一下,不过最重要的是清楚了一点:TableView内部是维护了一个类型为FXCollections.< S >observableArrayList的集合。其中< S >代表用户自己定义的类型。

也可以看到如何给Table添加监听者:

getProperties().addListener(new MapChangeListener<Object, Object>() {
    @Override
    public void onChanged(Change<? extends Object, ? extends Object> c) {
        if (c.wasAdded() && SET_CONTENT_WIDTH.equals(c.getKey())) {
            if (c.getValueAdded() instanceof Number) {
                setContentWidth((Double) c.getValueAdded());
            }
            getProperties().remove(SET_CONTENT_WIDTH);
        }
    }
});

总之你会看到许多非常有意思的东西,这里就不细说了,有兴趣的可以去自己读一下,对于理解TableView控件有着非常好的帮助,你能顾更加理解它运行的原理还有机制。

实际的运用

我们就来看看实际的运用吧,官方给出了非常详细的文档,有幸找到了把它翻译成较好版本中文的网站,直接给链接,里面就有一些简单的应用:

简单的应用:http://www.javafxchina.net/blog/2015/04/doc03_tableview/
官方的文档:http://docs.oracle.com/javafx/2/ui_controls/table-view.htm

TableView列的两种数据形式:

一种是维护类的TableColumn<Person,String>类型,列的每一个数据都是一个类(这里是一个Person类),而String类型对应列名。映射需要这样设置:

col.setCellValueFactory(
new PropertyValueFactory<Person, String>("firstName"));    // firstName对应列名

另一种是维护Map的TableColumn<Map,String>类型,列的每一个数据都是Map。设置映射时需要这样:

col.setCellValueFactory(new MapValueFactory(colName));        // colName对应字符类型列名```

表格可编辑:

可以向官方文档中那样,也可以先增加一个TextFieldTableCell,然后再添加响应函数:

// 设置CellFactory,填充一个TextField进列
col.setCellFactory(TextFieldTableCell.<Map>forTableColumn());
// 设置编辑响应的函数
col.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Map, String>>() {
    @Override public void handle(TableColumn.CellEditEvent<Map, String> t) {
    System.out.println("检测到改变"); 
    // 这里修改维护的对应的设置进TableView的ObservableList集合
    }
});

添加行删除行也是同样的操作,可以直接修改TableView维护的集合来完成。

增加列,删除列

这就不仅仅要删除集合中的数据,还要从表格里面的Columns集合中删除相应的数据才可以,或许你还会在删除和增加中加入一定的判断来保证操作的正确性:

table.getColumns().add(tempCol);        // 列表中显示新增的列
table.getColumns().remove(index);          // 删除index位置的列

监听列的变化

你大可以选择向源文件中的那样,通过getProperties().addListener来完成监听,同样也可以添加进一个ListChangeListener:

// 给table设置监听器监听列的变化
table.getColumns().addListener(new ListChangeListener() {
    @Override
    public void onChanged(Change c) {
        c.next();                   // 接受变化,否则报错

        // 处理列拖动后的事件
        if (c.wasRemoved()) {
            // 定义一个保存了现在列排序的集合
            List<TableColumn<ObservableList<Map>, String>> newList =
                    new ArrayList<>(table.getColumns());
            // 定义一个保存了原来列排序的集合
            List<TableColumn<ObservableList<Map>, String>> oldList =
                    new ArrayList<>(c.getList());
            // 相关操作
        }   // end if:拖动事件处理完毕
    }
});

欢迎转载,转载请注明出处!
简书ID:@我没有三颗心脏
github:wmyskxz
欢迎关注公众微信号:wmyskxz_javaweb
分享自己的Java Web学习之路以及各种Java学习资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,073评论 25 707
  • 眯眼一看,天亮了!楼下大爷大妈开始活动筋骨了,扭着屁股的大黄跟在大妈身后,偶然遭到大妈的嫌弃,你小子怎么走这么慢啊...
    上目阅读 172评论 1 0
  • 又是一部主打青春的电影,从《那些年》到《致青春》再到《匆匆那年》(其实我只看过这几部-_-||),每一部都能引...
    ForeverAlone枫阅读 344评论 0 0
  • 高敏儿所在的大学是一所重点中的重点,说实在的,能考上这样的大学,大家的智商都不在话下,就是情商也是各有千秋。校园里...
    子转阅读 399评论 0 0