JavaFX之TableView
添加列table.getColumns().addAll();?
ObservableList里面是存放的數(shù)據(jù)?
table.setItems(observableList);添加數(shù)據(jù)?
observableList里面一般是存放的Bean,列與Bean之間建立聯(lián)系,從而獲取值。
一、TableColumn列?
列與Bean之間建立聯(lián)系:?
setCellValueFactory();
通過cell值工廠建立與Bean的聯(lián)系。它這里并不需要知道你是傳了什么Bean,它只需要通過“字段名”反射去Bean里面獲得值,所以Bean屬性定義的名字不需要與它相同,只需要有字段名Property()?方法。?
setCellValueFactory(new PropertyValueFactory<Person, String>("字段名"));
?
TableColumn<Person,String> firstNameCol = new TableColumn<Person,String>("First Name"); firstNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("firstName")); 第二種設(shè)置方式setCellValueFactory(new CallBack<T,S>());
setCellValueFactory(new CallBack<TableColumn.CellDataFeatures<Person, String>,ObservableValue<String>>() @Overridepublic ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> cellData) {return new SimpleStringProperty(cellData.getValue().);} );TableColumn設(shè)置sort的3個(gè)方法?
setSortNode(Node);?// 默認(rèn)是表頭上的小圖標(biāo)三角形,可以改變?
setSortable(true);?// 設(shè)置可排序?
setSortType(SortType);//設(shè)置升降序?SortType.DESCENDING和SortType.ASCENDING
table.getSelectionModel().getSelectedCells().get(0).getTableColumn()?//?獲取選中的TableColumn
column中包含多個(gè)column,則可以調(diào)用TableColumn的getColumns().setAll(TableColumn...)
?
TableColumn<Person, String> firstNameColumn = new TableColumn<Person, String>("First"); firstNameColumn.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName")); // firstNameColumn.setCellFactory(TextFieldCellFactory.<Person>forTableColumn()); TableColumn<Person, String> lastNameColumn = new TableColumn<Person, String>("Last"); lastNameColumn.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName")); // lastNameColumn.setCellFactory(TextFieldCellFactory.<Person>forTableColumn()); TableColumn<Person, String> nameColumn = new TableColumn<Person, String>("Name"); nameColumn.getColumns().setAll(firstNameColumn, lastNameColumn);
二、TaleCell
對(duì)TableColumn的cell里面弄重新構(gòu)造
setCellFactory(TextFieldTableCell.forTableColumn());有一些默認(rèn)的構(gòu)造。?
?
setCellFactory(new Callback<TableColumn<Path, Number>, TableCell<Path, Number>>() {@Overridepublic TableCell<Path, Number> call(TableColumn<Path, Number> param) {return new MyTableCell<Path, Number>(); } }?
cell里面不僅只存放文字,還可以存放其它Node,需要重寫TableCell的update(T t,boolean empty)方法編輯單元格可以使用重寫startEdit()和cancelEdit()
class MyTableCell<Path, String> extends TableCell<Path, String> {protected void updateItem(Node node,boolean empty) { super.updateItem(node, empty); if (empty||node==null) { //tableCell沒有數(shù)據(jù)或者為空 setText(null); setGraphic(null); else { setText(null); setGraphic(node); //設(shè)置Node} }@Overridepublic void startEdit() {super.startEdit(); // 設(shè)置編輯狀態(tài) //super.setGraphic(null);//super.setText(null);}@Overridepublic void cancelEdit() {super.cancelEdit();//退出編輯狀態(tài)//super.setText(null); // super.setGraphic(null);} }?
雙擊鼠標(biāo)監(jiān)聽
通過tableColumn.setCellFactory(new TaskCellFactory());設(shè)置了CellFactory。
TaskCellFactory的內(nèi)容如下:
class TaskCellFactory implements Callback<TableColumn<Task, String>, TableCell<Task, String>> {@Overridepublic TableCell<Task, String> call(TableColumn<Task, String> param) {TextFieldTableCell<Task, String> cell = new TextFieldTableCell<>();cell.setOnMouseClicked((MouseEvent t) -> {if (t.getClickCount() == 2) {//雙擊執(zhí)行的代碼}}); return cell;} } 整個(gè)實(shí)現(xiàn)的核心就在于重點(diǎn)就在于實(shí)現(xiàn)Callback<TableColumn<Task, String>, TableCell<Task, String>>然后返回JavaFX API自帶的TextFieldTableCell。并在call()方法中,為cell增加了雙擊事件的處理。三、TableRow
通過setRowFactory,對(duì)行的雙擊進(jìn)行操作??
?
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 } } }); } }
四、MenuButton
在JavaFx的 TableView 上可以使用MenuButton來管理TableView的Column.
啟用MenuButton.
TableView.setTableMenuButtonVisible(true); ?
但是普通的MenuButton, 每次點(diǎn)擊都會(huì)刷新TableView
重寫TableMenuButton的事件
?
找到tableView 的 menuButton. Node menuButton = tableView</span>.lookup(".show-hide-columns-button"); EventHandler<MouseEvent> mousePressedHandler = new EventHandler<MouseEvent>() {@Overridepublic void handle(MouseEvent event) {//可以增加文本菜單對(duì)TableColumn的控制//中止eventevent.consume();} }; //增加menuButton的觸發(fā)事件 menuButton.addEventFilter(MouseEvent.MOUSE_PRESSED,mousePressedHandler);?
五、SelectionMode
table默認(rèn)是只能選著一行的,如果想選著多行,設(shè)置SelectionMode,此時(shí)可以對(duì)選中的多個(gè)進(jìn)行監(jiān)聽。?
?
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()得到的是個(gè)抽象類SelectionModel,它有二個(gè)子類MultipleSelectionModel, SingleSelectionModel。
getSelectedIndex() ??
getSelectedItem() ??
selectedIndexProperty() ??
selectedItemProperty() ??
selectFirst() ??
selectLast() ??
clearSelection() ??
clearSelection(int index)?
selectIndices(int index, int... indices) ??
selectRange(int start, int end) ??
select(int index) ??
select(T obj) ??
setSelectionMode(SelectionMode.MULTIPLE); ?
MultipleSelectionModel則提供多選功能,并且提供多選的一些方法。?
selectAboveCell() ??
selectBelowCell() ?
selectLeftCell() ??
selectRightCell() ? ?
setCellSelectionEnabled(boolean value) ??
select(int row, TableColumn<S,?> column) ??
選擇變換監(jiān)聽
tableview.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() { //tableview.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable,Object oldValue, Object newValue) { system.out.println("selection change"); } });
六、TableView的FXCSS
特殊的table設(shè)置
TableView的單元之間去掉行橫線?
?
.table-view .table-row-cell { -fx-background-insets: 0; }TableView的單元之間去掉沒有數(shù)據(jù)的豎線?
?
table-row-cell:empty .table-cell { -fx-border-width: 0px; } TableView的單元之間去掉豎線??
table-row-cell .table-cell { -fx-border-width: 0px; }TableView的TableColumn的列頭設(shè)置
?
.table-view .column-header{-fx-border-color:white lightgray white white; } table的空閑的列頭設(shè)置?
.table-view .filler{-fx-background-color: white; ? }table的列首背景設(shè)置,其中包括column-header,filler,MenuButton
?
.table-view .column-header-background{ -fx-background-color: white; }?
/* remove double borders from scrollbars */
?
.table-view > .virtual-flow > .scroll-bar:vertical{-fx-background-insets: 0, 0 0 0 1;-fx-padding: -1 -1 -1 0; }?
table的水平滾動(dòng)條設(shè)置
table的邊角設(shè)置
/* Selected rows */
?
.table-view:focused > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled:selected{-fx-background: -fx-selection-bar;-fx-table-cell-border-color: derive(-fx-selection-bar, 20%); }/* Selected when control is not focused */
?
?
.table-row-cell:filled > .table-cell:selected{-fx-background: -fx-selection-bar-non-focused;-fx-table-cell-border-color: derive(-fx-selection-bar-non-focused, 20%); } /* focused cell (keyboard navigation) */ .table-view:focused:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell > .table-cell:focused{-fx-background-color: -fx-background, -fx-cell-focus-inner-border, -fx-background;-fx-background-insets: 0, 1, 2; }.table-view{/* Constants used throughout the tableview. */-fx-table-header-border-color: -fx-box-border;-fx-table-cell-border-color: derive(-fx-color,5%); }
總結(jié)
以上是生活随笔為你收集整理的JavaFX之TableView的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 崽崽捏脸教程 崽崽zepeto教程怎么做
- 下一篇: 三国群英传2攻略 带你深入了解三国群英传