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()方法。
- firstNameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {
- @Override
- public ObservableValue<String> call(CellDataFeatures<Person, String> arg0) {
- // return new
- // SimpleStringProperty(arg0.getValue(),"sd",arg0.getValue().getFirstName());
- // //bean, bean的名称,值
- return new SimpleStringProperty(arg0.getValue().getFirstName());
- // 这样你能够不建立值与对象的映射关系。
- }
- });
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:
- firstNameCol.setCellFactory(new Callback<TableColumn<Person, String>, TableCell<Person, String>>() {
- @Override
- public TableCell<Person, String> call( // 单元格内容
- TableColumn<Person, String> arg0) {
- return new TableCell<Person, String>() { @Override
- protected void updateItem(final String str,boolean arg1) {
- super.updateItem(str, arg1);
- if (arg1) { setText(null);
- setGraphic(null);
- else { setText(str);
- setGraphic(new CheckBox());
- }
- }
- }
- });
和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...);
- firstNameColumn = new TableColumn<Person, String>("First");
- firstNameColumn.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));
- // firstNameColumn.setCellFactory(TextFieldCellFactory.<Person>forTableColumn());
- lastNameColumn = new TableColumn<Person, String>("Last");
- lastNameColumn.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName"));
- // lastNameColumn.setCellFactory(TextFieldCellFactory.<Person>forTableColumn());
- nameColumn = new TableColumn<Person, String>("Name");
- nameColumn.getColumns().setAll(firstNameColumn, lastNameColumn);
table的单元之间有明显的横线切割,能够通过css去掉。
去掉行横线
- .table-view .table-row-cell {
- ;
- }
若想同一时候去掉没有数据的竖线
- .table-row-cell:empty .table-cell {
- -fx-border-width: 0px;
- }
若想对行进行操作,能够通过setRowFactory。如以下对行的双击进行操作
- tableView.setRowFactory(new Callback<TableView<T>, TableRow<T>>() {
- @Override
- public TableRow<T> call(TableView<T> param) {
- return new TableRowControl();
- }
- });
- class TableRowControl extends TableRow<T> {
- public TableRowControl() {
- super();
- this.setOnMouseClicked(new EventHandler<MouseEvent>() {
- @Override
- public void handle(MouseEvent event) {
- if (event.getButton().equals(MouseButton.PRIMARY)
- && TableRowControl.this.getIndex() < tableView.getItems().size()) {
- //doSomething
- }
- }
- });
- }
- }
往table中插入数据。table中的数据显示,是依据你的itemlist来的。list里面的数据排什么序,那table也就排什么序。若加入一条新数据,直接往list里面加。
而list又提供按位置加,那么table显示就是按位置加了。
- tableView.getItems().add(selectedRow, newRecord);
newRecord一个新的对象,没赋值。
自己定义TableCell一般都是重写updateItem方法。假设有须要在编辑做操作,能够重写startEdit,cancelEdit
- @Override
- public void startEdit() {
- if (!this.getTableRow().isVisible()) {
- return;
- }
- super.startEdit();
- if (checkBox == null) {
- createCheckBox();
- }
- setText(null);
- setGraphic(checkBox);
- }
- @Override
- public void cancelEdit() {
- super.cancelEdit();
- setText(getItem().toString());
- setGraphic(null);
- }
能够看到,一旦点击编辑状态,则改变Cell里面的内容。一离开编辑就换成原本cell里面的内容。这样就能够显示的时候就是字符串,而编辑的时候就能够弄一个控件。如日历。
获取选中的TableColumn
- ).getTableColumn()
table自带方法能够过滤column,也就是仅仅显示哪些column
- table.setTableMenuButtonVisible(true);
设置为true后,会出现一个加号的column,它能够对column进行过滤
table默认是仅仅能选着一行的,假设想选着多行。设置SelectionMode,此时能够对选中的多个进行监听。
- ListChangeListener<Person> indicesListener = new ListChangeListener<Person>() {
- @Override public void onChanged(Change<? extends Person> c) {
- while (c.next()) {
- selectionUpdated(c.getAddedSubList(), c.getRemoved());
- }
- }
- };
- tableView.getSelectionModel().getSelectedItems().addListener(indicesListener);
- tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
tableView.getSelectionModel()得到的是个抽象类SelectionModel。它有二个子类MultipleSelectionModel, SingleSelectionModel。
它们主要处理选择事件,能够看它们的方法:
- getSelectedIndex()
- getSelectedItem()
- selectedIndexProperty()
- selectedItemProperty()
获取选中的item和索引。一个是获取其值,还有一个是获取封装属性,用于bind变化。
- select(int index)
- select(T obj)
- selectFirst()
- selectLast()
- ...
- clearSelection()
- clearSelection(int index)
这些方法都是操作选中。
- setSelectionMode(SelectionMode.MULTIPLE);
- selectIndices(int index, int... indices)
- selectRange(int start, int end)
MultipleSelectionModel则提供多选功能,而且提供多选的一些方法。
- select(int row, TableColumn<S,?
> column)
- selectAboveCell()
- selectBelowCell()
- selectLeftCell()
- selectRightCell()
- setCellSelectionEnabled(boolean value)
TableView.TableViewSelectionModel<S>是继承了MultipleSelectionModel,主要针对table的选中事件提供了一些方法。
这里有非常多javafx的小游戏,一个高手写的
http://lustrezhang.gotoip4.com/fxgame/
这里有个javafx学习的中文站点,我把内容都丢那上面去了。
http://www.jfxee.com/
JavaFX学习之道:JavaFX之TableView的更多相关文章
- 【javaFX学习】(二) 面板手册--1
找了好几个资料,没找到自己想要的,自己写个列表吧,方便以后用的时候挑选,边学边记.以学习笔记为主,所以会写的会偏个人记忆性.非教程,有什么问题一起讨论啊. 各个不同的控件放入不同的面板中有不同的效果, ...
- javafx基于使用fxml布局的tableview数据绑定用法
来个简单明了的 fxml的tableview数据绑定和java代码方式的数据绑定很像,不同的在于要有一到映射 首先看个目录 1.界面文件Sample.fxml <?xml version=&qu ...
- javafx将数据库内容输出到tableview表格
一 .创建Fxml文件,用Javafx Scene Builder 编辑页面,创建tableview(表格)和tablecolum(表格中的列),并为其设置fxid: 二.生成fxml文件的控制类: ...
- 【javaFX学习】(二) 面板手册
移至http://blog.csdn.net/qq_37837828/article/details/78732591 更新 找了好几个资料,没找到自己想要的,自己整理下吧,方便以后用的时候挑选,边学 ...
- JavaFX学习之路:详细解释JavaFX架构和框架
JavaFX 2.0平台是基于Java技术的富client平台.它使应用程序开发人员更加easy的开发和部署跨平台的富互联网应用(RIA).JavaFX 2.0文档包括了JavaFX 2.0所提供的功 ...
- 【javaFX学习】(一) 建一个简单的界面
转载注明出处:http://www.cnblogs.com/lensener/p/7976953.html 用过swing都知道有多蛋疼,界面有多丑.自从用了javaFX,腰也不酸了,腿也不疼了. 废 ...
- javaFx 学习笔记
1.每个javaFx程序定义在一个继承自javafx.application.Application的类中 Button:用于设置一个按钮,Button btOK = new Button(" ...
- Linux快速入门打开你的学习之道
Linux快速入门打开你的学习之道 相信看到这篇文章的你一定是想要学习Linux,或者已经在学习Linux的人了,那我们就可以一起探讨一下,学习Linux如何快速入门呢? 首先,希望大家弄清楚自己为什 ...
- JavaFX桌面应用-SpringBoot + JavaFX
SpringBoot对于Java程序员来说可以是一个福音,它让程序员在开发的时候,大大简化了各种spring的xml配置. 那么在JavaFX项目使用SpringBoot会是怎么样的体验呢? 这次使用 ...
随机推荐
- rails undefined method error_messages
rails undefined method error_messages 学习了:http://stackoverflow.com/questions/10002140/use-error-mess ...
- Maya 2012 破解安装全图文教程
在学习U3D的过程中.我们要用到Maya这个工具,(当然你也能够用其它类似的), 我在安装破解 Maya 2012 的过程其中,走了一些弯路.通过搜索发现,网上关于Maya 破解的文章大多语焉不详,为 ...
- ASPX和Razor
ASPX ASPX文件是微软的在server端运行的动态网页文件,通过IIS解析运行后能够得到动态页面,是微软推出的一种新的网络编程方法,而不是ASP的简单升级,由于它的编程方法和ASP有非常大的不同 ...
- HDU 5654 xiaoxin and his watermelon candy 离线树状数组
xiaoxin and his watermelon candy Problem Description During his six grade summer vacation, xiaoxin g ...
- DB-MySQL:MySQL 连接的使用
ylbtech-DB-MySQL:MySQL 连接的使用 1.返回顶部 1. Mysql 连接的使用 在前几章节中,我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多 ...
- HTML iframe 和 frameset 的区别
转自:http://www.cnblogs.com/polk6/archive/2013/05/24/3097430.html HTML iframe 和 frameset 的区别 iframe 和 ...
- shp系列(一)——利用C++进行shp文件的读(打开)与写(创建)开言
博客背景和目的 最近在用C++写一个底层的东西,需要读取和创建shp文件.虽然接触shp文件已经几年了,但是对于shp文件内到底包含什么东西一直是一知半解.以前使用shp文件都是利用软件(如ArcGI ...
- 剑指offer——02替换空格(Python3)
思路:Python列表中实现字符串的替换,涉及到频繁的插入操作,在数据结构中线性表分为顺序表和链表,顺序表的适合频繁的查询,链表适合频繁的插入和删除.综上所述,本题使用链表来实现. 我们从字符串的后面 ...
- 探讨:crond 引发大量sendmail进程的解决办法
某服务器账号comm无法登录,说是资源消耗完毕.于是用另一个账号登陆到服务器,检查common账号到底启动了哪些dd引起资源耗尽:ps -u common发现有个 sendmail的启动特别多例如:c ...
- MongoDB在MacOS上的客户端Robo 3T 的简单使用(二)
最近写了一个用node来操作MongoDB完成增.删.改.查.排序.分页功能的示例,并且已经放在了服务器上地址:http://39.105.32.180:3333. 本篇文章只做简单介绍,能够使用起来 ...