日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JavaFX学习之道:JavaFX之TableView

發布時間:2025/3/19 java 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaFX学习之道:JavaFX之TableView 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?TableView表?
?? TableColumn列?
構建一個表主要有TableView,TableColumn,ObservableList,Bean。?
加入列table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);?
ObservableList里面是存放的數據?
table.setItems(observableList);加入數據?
observableList里面通常是存放的Bean,列與Bean之間建立聯系,從而獲取值。?
列與Bean之間建立聯系:?
emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>("email"));通過cell值工廠建立與Bean的聯系。它這里并不須要知道你是傳了什么Bean,它僅僅須要通過“email”反射成getEmail()方法去Bean里面獲得值,所以Bean屬性定義的名字不須要與它同樣,僅僅須要有getEmail()方法。

?



Java代碼??
  • firstNameCol.setCellValueFactory(new?Callback<TableColumn.CellDataFeatures<Person,?String>,?ObservableValue<String>>()?{??
  • @Override??
  • public?ObservableValue<String>?call(CellDataFeatures<Person,?String>?arg0)?{??????????
  • //?return?new??
  • //?SimpleStringProperty(arg0.getValue(),"sd",arg0.getValue().getFirstName());??
  • //?//bean,?bean的名稱,值??
  • return?new?SimpleStringProperty(arg0.getValue().getFirstName());???
  • //?這樣你能夠不建立值與對象的映射關系。

    ??
  • ????}??
  • });??

  • arg0.getValue()等于這里的person。若是你observableList.add(list),則這arg0.getValue()等于list。?
    SimpleStringProperty(arg0.getValue(),"sd",arg0.getValue().getFirstName());?
    這里的意思既是arg0.getValue()既是你observableList.add的值。“sd”為bean取得名字,arg0.getValue().getFirstName()既是你該列想要獲得的值。假設是list則arg0.getValue().get(j)則為該列的每行賦值了。?

    cell里面不僅僅僅存放文字,還能夠存放其他Node:?
    Java代碼??
  • firstNameCol.setCellFactory(new?Callback<TableColumn<Person,?String>,?TableCell<Person,?String>>()?{??
  • ????@Override??
  • ????public?TableCell<Person,?String>?call(?//?單元格內容??
  • ????TableColumn<Person,?String>?arg0)?{??
  • ???????return?new?TableCell<Person,?String>()?{????????????????@Override??
  • ?????????protected?void?updateItem(final?String?str,boolean?arg1)?{????????
  • ??????????????super.updateItem(str,?arg1);??
  • ?????????if?(arg1)?{????????????????????????????setText(null);??
  • ????????setGraphic(null);??
  • ??????????else?{?????????????????????????????????setText(str);??
  • ??????????????????setGraphic(new?CheckBox());??
  • ????????}??
  • ??????????}??
  • ???????}??
  • });??

  • 和TreeCell使用一樣,能夠對cell里面弄又一次構造。

    ?


    lastNameCol.setCellFactory(TextFieldTableCell.forTableColumn());有一些默認的構造,就不須要自己去new TableCell了。?

    TableColumn設置sort的3個方法?
    firstNameCol.setSortNode(new Text("a")); // 默認是表頭上的小圖標三角形,能夠改變?
    firstNameCol.setSortable(true); // 設置可排序?
    firstNameCol.setSortType(SortType.DESCENDING);設置升降序?

    若要在一個column中包括多個column。則能夠調用TableColumn的getColumns().setAll(TableColumn...);?
    Java代碼??
  • ????????firstNameColumn?=?new?TableColumn<Person,?String>("First");??
  • ????????firstNameColumn.setCellValueFactory(new?PropertyValueFactory<Person,?String>("firstName"));??
  • //????????firstNameColumn.setCellFactory(TextFieldCellFactory.<Person>forTableColumn());??
  • ??
  • ????????lastNameColumn?=?new?TableColumn<Person,?String>("Last");??
  • ????????lastNameColumn.setCellValueFactory(new?PropertyValueFactory<Person,?String>("lastName"));??
  • //????????lastNameColumn.setCellFactory(TextFieldCellFactory.<Person>forTableColumn());??
  • ??
  • ????????nameColumn?=?new?TableColumn<Person,?String>("Name");??
  • ????????nameColumn.getColumns().setAll(firstNameColumn,?lastNameColumn);??


  • table的單元之間有明顯的橫線切割,能夠通過css去掉。

    ?


    去掉行橫線?
    Java代碼??
  • .table-view?.table-row-cell?{??
  • ????-fx-background-insets:?0;??
  • }??

  • 若想同一時候去掉沒有數據的豎線?
    Java代碼??
  • .table-row-cell:empty?.table-cell?{??
  • ????-fx-border-width:?0px;??
  • }??


  • 若想對行進行操作,能夠通過setRowFactory。如以下對行的雙擊進行操作?
    Java代碼??
  • ?tableView.setRowFactory(new?Callback<TableView<T>,?TableRow<T>>()?{??
  • ????????????@Override??
  • ????????????public?TableRow<T>?call(TableView<T>?param)?{??
  • ????????????????return?new?TableRowControl();??
  • ????????????}??
  • ????????});??
  • class?TableRowControl?extends?TableRow<T>?{??
  • ??
  • ????????public?TableRowControl()?{??
  • ????????????super();??
  • ????????????this.setOnMouseClicked(new?EventHandler<MouseEvent>()?{??
  • ????????????????@Override??
  • ????????????????public?void?handle(MouseEvent?event)?{??
  • ????????????????????if?(event.getButton().equals(MouseButton.PRIMARY)??
  • ????????????????????????????&&?event.getClickCount()?==?2??
  • ????????????????????????????&&?TableRowControl.this.getIndex()?<?tableView.getItems().size())?{??
  • ??????????????????????????//doSomething??
  • ????????????????????}??
  • ????????????????}??
  • ????????????});??
  • ????????}??
  • ????}??


  • 往table中插入數據。table中的數據顯示,是依據你的itemlist來的。list里面的數據排什么序,那table也就排什么序。若加入一條新數據,直接往list里面加。

    而list又提供按位置加,那么table顯示就是按位置加了。?


    Java代碼??
  • tableView.getItems().add(selectedRow,?newRecord);??

  • newRecord一個新的對象,沒賦值。?

    自己定義TableCell一般都是重寫updateItem方法。假設有須要在編輯做操作,能夠重寫startEdit,cancelEdit?
    Java代碼??
  • @Override??
  • ??????public?void?startEdit()?{??????
  • ??????????if?(!this.getTableRow().isVisible())?{??
  • ??????????????return;??
  • ??????????}??
  • ??????????super.startEdit();??
  • ??
  • ??????????if?(checkBox?==?null)?{??
  • ??????????????createCheckBox();??
  • ??????????}??
  • ??????????setText(null);??
  • ??????????setGraphic(checkBox);??
  • ??????}??
  • ??
  • ??????@Override??
  • ??????public?void?cancelEdit()?{??
  • ??????????super.cancelEdit();??
  • ??????????setText(getItem().toString());??
  • ??????????setGraphic(null);??
  • ??????}??

  • 能夠看到,一旦點擊編輯狀態,則改變Cell里面的內容。一離開編輯就換成原本cell里面的內容。這樣就能夠顯示的時候就是字符串,而編輯的時候就能夠弄一個控件。如日歷。?

    獲取選中的TableColumn?
    Java代碼??
  • table.getSelectionModel().getSelectedCells().get(0).getTableColumn()??



  • table自帶方法能夠過濾column,也就是僅僅顯示哪些column?
    Java代碼??
  • table.setTableMenuButtonVisible(true);??

  • 設置為true后,會出現一個加號的column,它能夠對column進行過濾?

    table默認是僅僅能選著一行的,假設想選著多行。設置SelectionMode,此時能夠對選中的多個進行監聽。

    ?


    Java代碼??
  • ListChangeListener<Person>?indicesListener?=?new???ListChangeListener<Person>()?{??
  • ???????????@Override?public?void?onChanged(Change<??extends?Person>?c)?{??
  • ???????????????while?(c.next())?{??
  • ??????????????????
  • ???????????????????selectionUpdated(c.getAddedSubList(),?c.getRemoved());??
  • ???????????????}??
  • ???????????}??
  • ???????};??
  • ???????tableView.getSelectionModel().getSelectedItems().addListener(indicesListener);??
  • ???????tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);??

  • tableView.getSelectionModel()得到的是個抽象類SelectionModel。它有二個子類MultipleSelectionModel, SingleSelectionModel。

    它們主要處理選擇事件,能夠看它們的方法:?


    Java代碼??
  • getSelectedIndex()???
  • getSelectedItem()???
  • selectedIndexProperty()???
  • selectedItemProperty()???

  • 獲取選中的item和索引。一個是獲取其值,還有一個是獲取封裝屬性,用于bind變化。

    ?


    Java代碼??
  • select(int?index)???
  • select(T?obj)???
  • selectFirst()???
  • selectLast()???
  • ...??
  • clearSelection()???
  • clearSelection(int?index)???

  • 這些方法都是操作選中。?
    Java代碼??
  • setSelectionMode(SelectionMode.MULTIPLE);??
  • selectIndices(int?index,?int...?indices)???
  • selectRange(int?start,?int?end)???

  • MultipleSelectionModel則提供多選功能,而且提供多選的一些方法。?
    Java代碼??
  • select(int?row,?TableColumn<S,?

    >?column)???

  • selectAboveCell()???
  • selectBelowCell()??
  • selectLeftCell()???
  • selectRightCell()????
  • setCellSelectionEnabled(boolean?value)???

  • TableView.TableViewSelectionModel<S>是繼承了MultipleSelectionModel,主要針對table的選中事件提供了一些方法。?




    這里有非常多javafx的小游戲,一個高手寫的?
    http://lustrezhang.gotoip4.com/fxgame/?

    這里有個javafx學習的中文站點,我把內容都丟那上面去了。?
    http://www.jfxee.com/

    總結

    以上是生活随笔為你收集整理的JavaFX学习之道:JavaFX之TableView的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。