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的选中事件提供了一些方法。 
  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!关于JavaFX中的TableView表格,我可以为您提供一些基本的信息和用法。 TableViewJavaFX中的表格控件,它可以用于显示和编辑表格数据。您可以在表格中显示多列数据,并允许用户对其中的数据进行排序、过滤和编辑等操作。 以下是一些常见的TableView用法: 1. 创建TableView: 您可以通过以下代码创建一个空的TableView: ```java TableView<YourDataModel> tableView = new TableView<>(); ``` 2. 定义表格列: 使用TableColumn类来定义表格的列,您可以指定列的标题、宽度、数据类型以及显示数据的方式等。例如: ```java TableColumn<YourDataModel, String> column1 = new TableColumn<>("Column 1"); column1.setCellValueFactory(new PropertyValueFactory<>("property1")); // 添加更多列... ``` 3. 填充表格数据: 您需要将数据模型绑定到表格中,使其能够显示数据。例如,如果您有一个包含数据的ObservableList,您可以这样将其设置给表格: ```java ObservableList<YourDataModel> data = FXCollections.observableArrayList(); tableView.setItems(data); ``` 4. 处理表格事件: 您可以根据需要添加事件处理程序来处理表格上的各种事件,例如单元格点击、双击、列排序等。 ```java tableView.setOnMouseClicked(event -> { if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) { // 处理双击事件 } }); ``` 5. 编辑表格数据: 您可以启用表格的编辑功能,使用户能够直接在表格中编辑数据。例如,如果您的数据模型具有可编辑的属性,您可以这样启用编辑功能: ```java tableView.setEditable(true); column1.setCellFactory(TextFieldTableCell.forTableColumn()); column1.setOnEditCommit(event -> { YourDataModel rowData = event.getRowValue(); rowData.setProperty1(event.getNewValue()); }); ``` 这只是一些基本的用法示例,您可以根据自己的需求进一步扩展和定制TableView的功能。希望对您有所帮助!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值