本文共 8939 字,大约阅读时间需要 29 分钟。
TableView表一、TableColumn列
列与Bean之间建立联系:
setCellValueFactory(); 通过cell值工厂建立与Bean的联系。它这里并不需要知道你是传了什么Bean,它只需要通过“字段名”反射去Bean里面获得值,所以Bean属性定义的名字不需要与它相同,只需要有字段名Property()
方法。 setCellValueFactory(new PropertyValueFactory<Person, String>("字段名"));
TableColumn第二种设置方式firstNameCol = new TableColumn ("First Name");firstNameCol.setCellValueFactory(new PropertyValueFactory ("firstName"));
setCellValueFactory(new CallBack<T,S>());
setCellValueFactory(new CallBack,ObservableValue >()@Override public ObservableValue call(TableColumn.CellDataFeatures cellData) { return new SimpleStringProperty(cellData.getValue().); });
TableColumn设置sort的3个方法
setSortNode(Node); // 默认是表头上的小图标三角形,可以改变 setSortable(true); // 设置可排序
setSortType(SortType);//设置升降序 SortType.DESCENDING和SortType.ASCENDING
table.getSelectionModel().getSelectedCells().get(0).getTableColumn() // 获取选中的TableColumn column中包含多个column,则可以调用TableColumn的getColumns().setAll(TableColumn...)
TableColumnfirstNameColumn = new TableColumn ("First");firstNameColumn.setCellValueFactory(new PropertyValueFactory ("firstName"));// firstNameColumn.setCellFactory(TextFieldCellFactory. forTableColumn());TableColumn lastNameColumn = new TableColumn ("Last");lastNameColumn.setCellValueFactory(new PropertyValueFactory ("lastName"));// lastNameColumn.setCellFactory(TextFieldCellFactory. forTableColumn());TableColumn nameColumn = new TableColumn ("Name");nameColumn.getColumns().setAll(firstNameColumn, lastNameColumn);
二、TaleCell
对TableColumn的cell里面弄重新构造 setCellFactory(TextFieldTableCell.forTableColumn());有一些默认的构造。
setCellFactory(new Callback, TableCell >() { @Override public TableCell call(TableColumn param) { return new MyTableCell (); }}
cell里面不仅只存放文字,还可以存放其它Node,需要重写TableCell的update(T t,boolean empty)方法编辑单元格可以使用重写startEdit()和cancelEdit()
class MyTableCellextends TableCell { protected void updateItem(Node node,boolean empty) { super.updateItem(node, empty); if (empty||node==null) { //tableCell没有数据或者为空 setText(null); setGraphic(null); else { setText(null); setGraphic(node); //设置Node } } @Override public void startEdit() { super.startEdit(); // 设置编辑状态 //super.setGraphic(null); //super.setText(null); } @Override public void cancelEdit() { super.cancelEdit(); //退出编辑状态 //super.setText(null); // super.setGraphic(null); }}
双击鼠标监听
通过tableColumn.setCellFactory(new TaskCellFactory());设置了CellFactory。
TaskCellFactory的内容如下:
class TaskCellFactory implements Callback整个实现的核心就在于重点就在于实现 Callback<TableColumn<Task, String>, TableCell<Task, String>>然后返回JavaFX API自带的 TextFieldTableCell。并在call()方法中,为cell增加了双击事件的处理。, TableCell > { @Override public TableCell call(TableColumn param) { TextFieldTableCell cell = new TextFieldTableCell<>(); cell.setOnMouseClicked((MouseEvent t) -> { if (t.getClickCount() == 2) { //双击执行的代码 } }); return cell; }}
三、TableRow
通过setRowFactory,对行的双击进行操作
tableView.setRowFactory(new Callback, TableRow >() { @Override public TableRow call(TableView param) { return new TableRowControl(); } });
class TableRowControl extends TableRow{ public TableRowControl() { super(); this.setOnMouseClicked(new EventHandler () { @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, 每次点击都会刷新TableView
重写TableMenuButton的事件
找到tableView 的 menuButton.Node menuButton = tableView.lookup(".show-hide-columns-button");EventHandlermousePressedHandler = new EventHandler () { @Override public void handle(MouseEvent event) { //可以增加文本菜单对TableColumn的控制 //中止event event.consume(); }};//增加menuButton的触发事件menuButton.addEventFilter(MouseEvent.MOUSE_PRESSED, mousePressedHandler);
五、SelectionMode
table默认是只能选着一行的,如果想选着多行,设置SelectionMode,此时可以对选中的多个进行监听。
ListChangeListenerindicesListener = new ListChangeListener () { @Override public void onChanged(Change c) { while (c.next()) { selectionUpdated(c.getAddedSubList(), c.getRemoved()); } } }; tableView.getSelectionModel().getSelectedItems().addListener(indicesListener); tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
tableView.getSelectionModel()得到的是个抽象类SelectionModel,它有二个子类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)选择变换监听
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设置
TableView的单元之间去掉行横线
.table-view .table-row-cell { -fx-background-insets: 0; }
TableView的单元之间去掉没有数据的竖线
table-row-cell:empty .table-cell { -fx-border-width: 0px; }TableView 的单元之间去掉 竖线
table-row-cell .table-cell { -fx-border-width: 0px; }
TableView的TableColumn的列头设置
.table-view .column-header{ -fx-border-color:white lightgray white white; }table的 空闲的列头设置
.table-view .filler{ -fx-background-color: white; }table的 列 首背景 设置,其中包括column-header,filler, MenuButton
.table-view .column-header-background{ -fx-background-color: white; }
/* remove double borders from scrollbars */
table的 垂直滚动条 设置
.table-view > .virtual-flow > .scroll-bar:vertical{ -fx-background-insets: 0, 0 0 0 1; -fx-padding: -1 -1 -1 0;}
table的水平滚动条设置
.table-view > .virtual-flow > .scroll-bar:horizontal{ -fx-background-insets: 0, 1 0 0 0; -fx-padding: 0 -1 -1 -1;}
table的边角设置
.table-view > .virtual-flow > .corner { -fx-background-color: derive(-fx-base,-1%); /*-fx-base 是modena 预先定义的颜色*/}
/* 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%);}
.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%);}
转载地址:https://maokun.blog.csdn.net/article/details/78638522 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!