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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM