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代碼  收藏代碼
  1. firstNameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {  
  2. @Override  
  3. public ObservableValue<String> call(CellDataFeatures<Person, String> arg0) {          
  4. // return new  
  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的選中事件提供了一些方法。 




這裏有很多javafx的小遊戲,一個高手寫的 
http://lustrezhang.gotoip4.com/fxgame/ 

這裏有個javafx學習的中文網站,我把內容都丟那上面去了。 
http://www.jfxee.com/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章