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

歡迎訪問 生活随笔!

生活随笔

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

java

JavaFX之TableView

發布時間:2023/12/3 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaFX之TableView 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
TableView表? 構建一個表主要有TableView,TableColumn,ObservableList,Bean。
添加列table.getColumns().addAll();?
ObservableList里面是存放的數據?
table.setItems(observableList);添加數據?
observableList里面一般是存放的Bean,列與Bean之間建立聯系,從而獲取值。

一、TableColumn列?

列與Bean之間建立聯系:?
setCellValueFactory();
通過cell值工廠建立與Bean的聯系。它這里并不需要知道你是傳了什么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")); 第二種設置方式

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設置sort的3個方法?

setSortNode(Node);?// 默認是表頭上的小圖標三角形,可以改變?
setSortable(true);?// 設置可排序?

setSortType(SortType);//設置升降序?SortType.DESCENDINGSortType.ASCENDING


table.getSelectionModel().getSelectedCells().get(0).getTableColumn()?//?獲取選中的TableColumn
column中包含多個column,則可以調用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

對TableColumn的cell里面弄重新構造
setCellFactory(TextFieldTableCell.forTableC
olumn());有一些默認的構造。?

?

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沒有數據或者為空 setText(null); setGraphic(null); else { setText(null); setGraphic(node); //設置Node} }@Overridepublic void startEdit() {super.startEdit(); // 設置編輯狀態 //super.setGraphic(null);//super.setText(null);}@Overridepublic void cancelEdit() {super.cancelEdit();//退出編輯狀態//super.setText(null); // super.setGraphic(null);} }

?

雙擊鼠標監聽

通過tableColumn.setCellFactory(new TaskCellFactory());設置了CellFactory。

TaskCellFactory的內容如下:

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) {//雙擊執行的代碼}}); return cell;} } 整個實現的核心就在于重點就在于實現Callback<TableColumn<Task, String>, TableCell<Task, String>>然后返回JavaFX API自帶的TextFieldTableCell。并在call()方法中,為cell增加了雙擊事件的處理。

三、TableRow

通過setRowFactory,對行的雙擊進行操作?

?

?

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, 每次點擊都會刷新TableView

重寫TableMenuButton的事件

?

找到tableView 的 menuButton. Node menuButton = tableView</span>.lookup(".show-hide-columns-button"); EventHandler<MouseEvent> mousePressedHandler = new EventHandler<MouseEvent>() {@Overridepublic void handle(MouseEvent event) {//可以增加文本菜單對TableColumn的控制//中止eventevent.consume();} }; //增加menuButton的觸發事件 menuButton.addEventFilter(MouseEvent.MOUSE_PRESSED,mousePressedHandler);

?


五、SelectionMode

table默認是只能選著一行的,如果想選著多行,設置SelectionMode,此時可以對選中的多個進行監聽。?

?

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。

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%); } /* 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%); }

總結

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

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