JavaFX学习之道:JavaFX之TableView

时间:2021-09-23 17:04:11
 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代码   JavaFX学习之道:JavaFX之TableView
  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代码   JavaFX学习之道:JavaFX之TableView
  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代码   JavaFX学习之道:JavaFX之TableView
  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代码   JavaFX学习之道:JavaFX之TableView
  1. .table-view .table-row-cell {  
  2.     -fx-background-insets: 0;  
  3. }  

若想同一时候去掉没有数据的竖线 
Java代码   JavaFX学习之道:JavaFX之TableView
  1. .table-row-cell:empty .table-cell {  
  2.     -fx-border-width: 0px;  
  3. }  


若想对行进行操作,能够通过setRowFactory。如以下对行的双击进行操作 
Java代码   JavaFX学习之道:JavaFX之TableView
  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代码   JavaFX学习之道:JavaFX之TableView
  1. tableView.getItems().add(selectedRow, newRecord);  

newRecord一个新的对象,没赋值。 

自己定义TableCell一般都是重写updateItem方法。假设有须要在编辑做操作,能够重写startEdit,cancelEdit 
Java代码   JavaFX学习之道:JavaFX之TableView
  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代码   JavaFX学习之道:JavaFX之TableView
  1. table.getSelectionModel().getSelectedCells().get(0).getTableColumn()  



table自带方法能够过滤column,也就是仅仅显示哪些column 
Java代码   JavaFX学习之道:JavaFX之TableView
  1. table.setTableMenuButtonVisible(true);  

设置为true后,会出现一个加号的column,它能够对column进行过滤 

table默认是仅仅能选着一行的,假设想选着多行。设置SelectionMode,此时能够对选中的多个进行监听。

 

Java代码   JavaFX学习之道:JavaFX之TableView
  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代码   JavaFX学习之道:JavaFX之TableView
  1. getSelectedIndex()   
  2. getSelectedItem()   
  3. selectedIndexProperty()   
  4. selectedItemProperty()   

获取选中的item和索引。一个是获取其值,还有一个是获取封装属性,用于bind变化。

 

Java代码   JavaFX学习之道:JavaFX之TableView
  1. select(int index)   
  2. select(T obj)   
  3. selectFirst()   
  4. selectLast()   
  5. ...  
  6. clearSelection()   
  7. clearSelection(int index)   

这些方法都是操作选中。 
Java代码   JavaFX学习之道:JavaFX之TableView
  1. setSelectionMode(SelectionMode.MULTIPLE);  
  2. selectIndices(int index, int... indices)   
  3. selectRange(int start, int end)   

MultipleSelectionModel则提供多选功能,而且提供多选的一些方法。 
Java代码   JavaFX学习之道:JavaFX之TableView
  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/