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()方法。 

css

Java代碼  收藏代碼ide

  1. firstNameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {  this

  2. @Override  spa

  3. public ObservableValue<String> call(CellDataFeatures<Person, String> arg0) {          對象

  4. // return new  blog

  5. // SimpleStringProperty(arg0.getValue(),"sd",arg0.getValue().getFirstName());  排序

  6. // //bean, bean的名稱,值  繼承

  7. return new SimpleStringProperty(arg0.getValue().getFirstName());   索引

  8. // 這樣你能夠不創建值與對象的映射關係。  事件

  9.     }  

  10. });  


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代碼  收藏代碼

  1. firstNameCol.setCellFactory(new Callback<TableColumn<Person, String>, TableCell<Person, String>>() {  

  2.     @Override  

  3.     public TableCell<Person, String> call( // 單元格內容  

  4.     TableColumn<Person, String> arg0) {  

  5.        return new TableCell<Person, String>() {                @Override  

  6.          protected void updateItem(final String str,boolean arg1) {        

  7.               super.updateItem(str, arg1);  

  8.          if (arg1) {                            setText(null);  

  9.         setGraphic(null);  

  10.           else {                                 setText(str);  

  11.                   setGraphic(new CheckBox());  

  12.         }  

  13.           }  

  14.        }  

  15. });  


和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代碼  收藏代碼

  1.         firstNameColumn = new TableColumn<Person, String>("First");  

  2.         firstNameColumn.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));  

  3. //        firstNameColumn.setCellFactory(TextFieldCellFactory.<Person>forTableColumn());  

  4.   

  5.         lastNameColumn = new TableColumn<Person, String>("Last");  

  6.         lastNameColumn.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName"));  

  7. //        lastNameColumn.setCellFactory(TextFieldCellFactory.<Person>forTableColumn());  

  8.   

  9.         nameColumn = new TableColumn<Person, String>("Name");  

  10.         nameColumn.getColumns().setAll(firstNameColumn, lastNameColumn);  



table的單元之間有明顯的橫線分割,能夠經過css去掉。 
去掉行橫線 

Java代碼  收藏代碼

  1. .table-view .table-row-cell {  

  2.     -fx-background-insets: 0;  

  3. }  


若想同時去掉沒有數據的豎線 

Java代碼  收藏代碼

  1. .table-row-cell:empty .table-cell {  

  2.     -fx-border-width: 0px;  

  3. }  



若想對行進行操做,能夠經過setRowFactory。以下面對行的雙擊進行操做 

Java代碼  收藏代碼

  1.  tableView.setRowFactory(new Callback<TableView<T>, TableRow<T>>() {  

  2.             @Override  

  3.             public TableRow<T> call(TableView<T> param) {  

  4.                 return new TableRowControl();  

  5.             }  

  6.         });  

  7. class TableRowControl extends TableRow<T> {  

  8.   

  9.         public TableRowControl() {  

  10.             super();  

  11.             this.setOnMouseClicked(new EventHandler<MouseEvent>() {  

  12.                 @Override  

  13.                 public void handle(MouseEvent event) {  

  14.                     if (event.getButton().equals(MouseButton.PRIMARY)  

  15.                             && event.getClickCount() == 2  

  16.                             && TableRowControl.this.getIndex() < tableView.getItems().size()) {  

  17.                           //doSomething  

  18.                     }  

  19.                 }  

  20.             });  

  21.         }  

  22.     }  



往table中插入數據,table中的數據顯示,是根據你的itemlist來的,list裏面的數據排什麼序,那table也就排什麼序。若添加一條新數據,直接往list裏面加。而list又提供按位置加,那麼table顯示就是按位置加了。 

Java代碼  收藏代碼

  1. tableView.getItems().add(selectedRow, newRecord);  


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

自定義TableCell通常都是重寫updateItem方法。若是有須要在編輯作操做,能夠重寫startEdit,cancelEdit 

Java代碼  收藏代碼

  1. @Override  

  2.       public void startEdit() {      

  3.           if (!this.getTableRow().isVisible()) {  

  4.               return;  

  5.           }  

  6.           super.startEdit();  

  7.   

  8.           if (checkBox == null) {  

  9.               createCheckBox();  

  10.           }  

  11.           setText(null);  

  12.           setGraphic(checkBox);  

  13.       }  

  14.   

  15.       @Override  

  16.       public void cancelEdit() {  

  17.           super.cancelEdit();  

  18.           setText(getItem().toString());  

  19.           setGraphic(null);  

  20.       }  


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

獲取選中的TableColumn 

Java代碼  收藏代碼

  1. table.getSelectionModel().getSelectedCells().get(0).getTableColumn()  




table自帶方法能夠過濾column,也就是隻顯示哪些column 

Java代碼  收藏代碼

  1. table.setTableMenuButtonVisible(true);  


設置爲true後,會出現一個加號的column,它能夠對column進行過濾 

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

Java代碼  收藏代碼

  1. ListChangeListener<Person> indicesListener = new   ListChangeListener<Person>() {  

  2.            @Override public void onChanged(Change<? extends Person> c) {  

  3.                while (c.next()) {  

  4.                   

  5.                    selectionUpdated(c.getAddedSubList(), c.getRemoved());  

  6.                }  

  7.            }  

  8.        };  

  9.        tableView.getSelectionModel().getSelectedItems().addListener(indicesListener);  

  10.        tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);  


tableView.getSelectionModel()獲得的是個抽象類SelectionModel,它有二個子類MultipleSelectionModel, SingleSelectionModel。它們主要處理選擇事件,能夠看它們的方法: 

Java代碼  收藏代碼

  1. getSelectedIndex()   

  2. getSelectedItem()   

  3. selectedIndexProperty()   

  4. selectedItemProperty()   


獲取選中的item和索引。一個是獲取其值,另外一個是獲取封裝屬性,用於bind變化。 

Java代碼  收藏代碼

  1. select(int index)   

  2. select(T obj)   

  3. selectFirst()   

  4. selectLast()   

  5. ...  

  6. clearSelection()   

  7. clearSelection(int index)   


這些方法都是操做選中。 

Java代碼  收藏代碼

  1. setSelectionMode(SelectionMode.MULTIPLE);  

  2. selectIndices(int index, int... indices)   

  3. selectRange(int start, int end)   


MultipleSelectionModel則提供多選功能,而且提供多選的一些方法。 

Java代碼  收藏代碼

  1. select(int row, TableColumn<S,?> column)   

  2. selectAboveCell()   

  3. selectBelowCell()  

  4. selectLeftCell()   

  5. selectRightCell()    

  6. setCellSelectionEnabled(boolean value)   


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

相關文章
相關標籤/搜索