zoukankan      html  css  js  c++  java
  • 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- 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/
  • 相关阅读:
    深入浅出Redis(三)高级特性:管道
    CxImage的编译及简单使用举例
    [Zlib]_[0基础]_[使用zlib库压缩文件]
    java 实现打印当前月份的日历
    hdu 5087 Revenge of LIS II ( LIS ,第二长子序列)
    spring理解一
    poj 3181 Dollar Dayz (整数划分问题---递归+DP)
    android键盘事件
    Linux编程环境介绍(2) -- shell(Bash) 介绍
    iphone开发中数据持久化之——嵌入式SQLite(三)
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7027200.html
Copyright © 2011-2022 走看看