JavaFX-TableView詳解

前言

最近在著手一個(gè)學(xué)生管理系統(tǒng)的編寫(xiě)拥娄,涉及到TableView的使用茴扁,這前前后后的也有了些經(jīng)驗(yàn)和想法想要記錄和分享一下(事實(shí)上我正在想要用html網(wǎng)頁(yè)代替界面),更多的是學(xué)習(xí)之用靴跛。

先看看TableView中有些什么

在IDEA中谦絮,按住Ctrl然后點(diǎn)中TableView關(guān)鍵字會(huì)自動(dòng)跟進(jìn)到它定義的地方,我們可以先看看這里面到底都有些什么東西紧显。

你會(huì)比較先的看到它的兩個(gè)構(gòu)造函數(shù):

// 第一個(gè)構(gòu)造函數(shù)
public TableView() {
    this(FXCollections.<S>observableArrayList());
}

// 第二個(gè)構(gòu)造函數(shù)
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;
}

可以大致的看一下讲衫,不過(guò)最重要的是清楚了一點(diǎn):TableView內(nèi)部是維護(hù)了一個(gè)類型為FXCollections.< S >observableArrayList的集合。其中< S >代表用戶自己定義的類型孵班。

也可以看到如何給Table添加監(jiān)聽(tīng)者:

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);
        }
    }
});

總之你會(huì)看到許多非常有意思的東西焦人,這里就不細(xì)說(shuō)了,有興趣的可以去自己讀一下重父,對(duì)于理解TableView控件有著非常好的幫助花椭,你能顧更加理解它運(yùn)行的原理還有機(jī)制。

實(shí)際的運(yùn)用

我們就來(lái)看看實(shí)際的運(yùn)用吧房午,官方給出了非常詳細(xì)的文檔矿辽,有幸找到了把它翻譯成較好版本中文的網(wǎng)站,直接給鏈接郭厌,里面就有一些簡(jiǎn)單的應(yīng)用:

簡(jiǎn)單的應(yīng)用:http://www.javafxchina.net/blog/2015/04/doc03_tableview/
官方的文檔:http://docs.oracle.com/javafx/2/ui_controls/table-view.htm

TableView列的兩種數(shù)據(jù)形式:

一種是維護(hù)類的TableColumn<Person,String>類型袋倔,列的每一個(gè)數(shù)據(jù)都是一個(gè)類(這里是一個(gè)Person類),而String類型對(duì)應(yīng)列名折柠。映射需要這樣設(shè)置:

col.setCellValueFactory(
new PropertyValueFactory<Person, String>("firstName"));    // firstName對(duì)應(yīng)列名

另一種是維護(hù)Map的TableColumn<Map,String>類型宾娜,列的每一個(gè)數(shù)據(jù)都是Map。設(shè)置映射時(shí)需要這樣:

col.setCellValueFactory(new MapValueFactory(colName));        // colName對(duì)應(yīng)字符類型列名```

表格可編輯:

可以向官方文檔中那樣扇售,也可以先增加一個(gè)TextFieldTableCell前塔,然后再添加響應(yīng)函數(shù):

// 設(shè)置CellFactory,填充一個(gè)TextField進(jìn)列
col.setCellFactory(TextFieldTableCell.<Map>forTableColumn());
// 設(shè)置編輯響應(yīng)的函數(shù)
col.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Map, String>>() {
    @Override public void handle(TableColumn.CellEditEvent<Map, String> t) {
    System.out.println("檢測(cè)到改變"); 
    // 這里修改維護(hù)的對(duì)應(yīng)的設(shè)置進(jìn)TableView的ObservableList集合
    }
});

添加行刪除行也是同樣的操作承冰,可以直接修改TableView維護(hù)的集合來(lái)完成华弓。

增加列,刪除列

這就不僅僅要?jiǎng)h除集合中的數(shù)據(jù)困乒,還要從表格里面的Columns集合中刪除相應(yīng)的數(shù)據(jù)才可以寂屏,或許你還會(huì)在刪除和增加中加入一定的判斷來(lái)保證操作的正確性:

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

監(jiān)聽(tīng)列的變化

你大可以選擇向源文件中的那樣,通過(guò)getProperties().addListener來(lái)完成監(jiān)聽(tīng),同樣也可以添加進(jìn)一個(gè)ListChangeListener:

// 給table設(shè)置監(jiān)聽(tīng)器監(jiān)聽(tīng)列的變化
table.getColumns().addListener(new ListChangeListener() {
    @Override
    public void onChanged(Change c) {
        c.next();                   // 接受變化迁霎,否則報(bào)錯(cuò)

        // 處理列拖動(dòng)后的事件
        if (c.wasRemoved()) {
            // 定義一個(gè)保存了現(xiàn)在列排序的集合
            List<TableColumn<ObservableList<Map>, String>> newList =
                    new ArrayList<>(table.getColumns());
            // 定義一個(gè)保存了原來(lái)列排序的集合
            List<TableColumn<ObservableList<Map>, String>> oldList =
                    new ArrayList<>(c.getList());
            // 相關(guān)操作
        }   // end if:拖動(dòng)事件處理完畢
    }
});

歡迎轉(zhuǎn)載吱抚,轉(zhuǎn)載請(qǐng)注明出處!
簡(jiǎn)書(shū)ID:@我沒(méi)有三顆心臟
github:wmyskxz
歡迎關(guān)注公眾微信號(hào):wmyskxz_javaweb
分享自己的Java Web學(xué)習(xí)之路以及各種Java學(xué)習(xí)資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末考廉,一起剝皮案震驚了整個(gè)濱河市秘豹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芝此,老刑警劉巖憋肖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異婚苹,居然都是意外死亡岸更,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門膊升,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)怎炊,“玉大人,你說(shuō)我怎么就攤上這事廓译∪惩” “怎么了捌归?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵省艳,是天一觀的道長(zhǎng)颁股。 經(jīng)常有香客問(wèn)我,道長(zhǎng)征绸,這世上最難降的妖魔是什么久橙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮管怠,結(jié)果婚禮上淆衷,老公的妹妹穿的比我還像新娘。我一直安慰自己渤弛,他們只是感情好祝拯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著她肯,像睡著了一般佳头。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辕宏,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天畜晰,我揣著相機(jī)與錄音,去河邊找鬼瑞筐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的聚假。 我是一名探鬼主播块蚌,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼膘格!你這毒婦竟也來(lái)了峭范?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瘪贱,失蹤者是張志新(化名)和其女友劉穎纱控,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體菜秦,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甜害,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了球昨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尔店。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖主慰,靈堂內(nèi)的尸體忽然破棺而出嚣州,到底是詐尸還是另有隱情,我是刑警寧澤共螺,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布该肴,位于F島的核電站,受9級(jí)特大地震影響藐不,放射性物質(zhì)發(fā)生泄漏匀哄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一佳吞、第九天 我趴在偏房一處隱蔽的房頂上張望拱雏。 院中可真熱鬧,春花似錦底扳、人聲如沸铸抑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鹊汛。三九已至,卻和暖如春阱冶,著一層夾襖步出監(jiān)牢的瞬間刁憋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工木蹬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留至耻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像尘颓,于是被迫代替她去往敵國(guó)和親走触。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理疤苹,服務(wù)發(fā)現(xiàn)互广,斷路器,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,074評(píng)論 25 707
  • 瞇眼一看卧土,天亮了惫皱!樓下大爺大媽開(kāi)始活動(dòng)筋骨了,扭著屁股的大黃跟在大媽身后尤莺,偶然遭到大媽的嫌棄旅敷,你小子怎么走這么慢啊...
    上目閱讀 176評(píng)論 1 0
  • 又是一部主打青春的電影,從《那些年》到《致青春》再到《匆匆那年》(其實(shí)我只看過(guò)這幾部-_-||)缝裁,每一部都能引...
    ForeverAlone楓閱讀 350評(píng)論 0 0
  • 高敏兒所在的大學(xué)是一所重點(diǎn)中的重點(diǎn)捷绑,說(shuō)實(shí)在的韩脑,能考上這樣的大學(xué),大家的智商都不在話下粹污,就是情商也是各有千秋段多。校園里...
    子轉(zhuǎn)閱讀 414評(píng)論 0 0