文档章节

JavaFX学习之道:JavaFX之TableView

Fly的狐狸
 Fly的狐狸
发布于 2014/11/12 12:33
字数 1177
阅读 821
收藏 6

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的选中事件提供了一些方法。 


本文转载自:http://blog.csdn.net/u011511429/article/details/38275759

Fly的狐狸
粉丝 140
博文 20
码字总数 4807
作品 9
石景山
高级程序员
私信 提问
認識JavaFX

作者:蔡學鏞 注意:本文章內容是依據alpha版技術做描述,讀者閱讀時可能已經和實際現況有所差異。 雖 然Ajax方興未艾,但RIA(Rich Internet/Interface Application)也已經揭開序幕,同樣是...

红薯
2009/02/12
896
2
JavaFX 2.2 正式发布,下一版本为 8.0

甲骨文今天正式发布了JavaFX 2.2。 该版本中包含了针对Windows、Linux和Mac OS X平台的SDK,不过JavaFX运行时仍然只支持Windows和Linux平台。 该版本的主要新特性包括: 支持H.264和AAC编码的...

Jeky
2012/08/16
2.7K
20
JavaFX的5个英文学习文档

1 什么是JavaFX? Maybe you've worked with previous versions of JavaFX or maybe you are new to JavaFX. Either way, this doc explains the features of JavaFX 2.0 Beta and what type ......

Vancl
2011/07/27
575
2
开始学习JavaFX (译)

原文地址:http://download.oracle.com/javafx/2.0/get_started/jfxpub-get_started.htm 如果你想使用 JavaFX 快速创建拥有富客户体验的应用程序,那么这个文章正是为你准备的。你将学习如何...

Jeky
2011/10/10
6.9K
6
(翻译)JavaFX高级教程:部署JavaFX2.0应用

原文地址http://download.oracle.com/javafx/2.0/deployment/jfxpub-deployment.htm (译者:由于国内学习JavaFX2.0的童鞋可能极少,加之后面的技术相对高级和复杂,另外本人时间略显不足,后...

davelet
2011/10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
15
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
16
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部