JavaFX学习之道:JavaFX之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 {
- -fx-background-insets: 0;
- }
若想同一时候去掉没有数据的竖线
- .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)
- && event.getClickCount() == 2
- && 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
- table.getSelectionModel().getSelectedCells().get(0).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学习之道:布局面板之 HBox
HBox 布局面板可以很方便的让所有控件都排列成一行. 可以通过设置 padding 属性来设置控件与 HBox 边缘之间的距离.可以通过设置 spacing 属性来设置各个控件之间的距离.可以设置 ...
- mysql tableveiw与表格,javafx将数据库内容输出到tableview表格
一 .创建Fxml文件,用Javafx Scene Builder 编辑页面,创建tableview(表格)和tablecolum(表格中的列),并为其设置fxid: 二.生成fxml文件的控制类: ...
- JAVAFX学习笔记
首先,javafx有点像前端,我们可以把他理解为这样的结构 分别为 窗口:就是显示的窗口 场景:相当于页面,整个可操作的大小,估计可以切换不同场景 节点:就是内部各个模块,自己一个个设置 代码如下 p ...
- javaFX学习之Menu下创建子菜单及菜单项的例子
使用RadioMenuItem来创建子菜单的菜单项.将RadioMenuItem类型菜单项添加到ToggleGroup(互斥切换组)类型对象中,使各个RadioMenuItem类型菜单项的选中是相互排 ...
- 学习笔记:Javafx获取系统中已经安装的字体
方法:利用javafx.scene.text.Font创建字体 通过所创建Font实例,调用getFamilies()方法,返回值为字体集名字的列表(List<String>) 此处需要创 ...
- javafx学习教程
1.舞台,场景,布局,控件,回调 2.舞台:窗口,一个舞台一个窗口,舞台有舞台基础属性,舞台监听事件,做一些回调 3.fxml里面可以写 页面的布局,控件,然后在主程序里面显示页面,舞台,场景 然后 ...
- javaFx学习之分页控件Pagination
原文链接:DOC-03-27 分页控件(Pagination Control) | JavaFX中文资料 JavaFX程序中添加分页(Pagination)控件.它会告诉你如何向程序中添加Pagina ...
- javaFX学习之Accordion和TitledPane组件的配合使用
原文链接:DOC-03-23 标题面板(Titled Pane)和可折叠面板(Accordion) | JavaFX中文资料 javaFX应用程序中组合使用Accordion和TitlePane Ti ...
- javaFX学习笔记之 散布图(Scatter Chart)
(Scatter Chart),它是一种用一组点来表示数据的双轴图表. 每个点通过X和Y值来定义.跟其他双轴图表类似,你可以创建一组或者多组数据.图展示了一个带有三组数据的Scatter Chart. ...
最新文章
- 树莓派开发4-串口通讯wiringpi库
- java web编码详解_java web 开发 编码问题详解
- docker piwik
- 经典C语言程序100例之五五
- C++ Multisets
- 从字节码层面分析==比较integer和int
- 微信公众平台开发——在线点歌
- 华为mate40会不会有鸿蒙系统,鸿蒙OS系统正式推送,拿华为Mate40更新后,发现了优缺点...
- linux telnet无法连接,奇怪的问题:telnet无法连接另一台server的正常的开放端口
- Windows Mobile 获取来电号码和屏蔽来电
- jsp中java代码、jsp代码、js代码执行的顺序
- 微信公众号笔记(一)
- 模拟点击框架网页内无id无name的按钮
- 【Unity3D实战】摇摆直升机开发实战(一)
- 上海科技大学和 计算机,上海容易被忽略的高校--上海科技大学,本科升学率近80%,力压复旦、上交!...
- 黑苹果电源键睡眠关机的分析及解决办法
- 高中计算机听课总结,中学新信息技术老师听课心得体会五篇
- 基于面部视频的心率监测系统 day 10
- 嵌入式与通用计算机的相同点,嵌入式计算机与通用计算机的区别与联系
- nant_强制NAnt使用.NET Framework的特定版本进行构建和运行
热门文章
- 如何利用python进行数据分析统计服_利用Python进行数据分析
- np.reshape带给我的内存错误
- 用c语言输出26个英文字母,菜鸟求助,写一个随机输出26个英文字母的程序
- hadoop本地模式部署_hadoop启动模式、基本配置、启动方式
- c语言放空一个数组,C++语言
- js修改video的source_利用 javascript MediaSource 将 HTML video标签的src转成加载blob
- 路由器 radius认证获取ip_玩转网络工程师·认证篇
- linux ls 输出对齐,理解 Linux 中 `ls` 的输出
- php保存设置,php如何实现编辑和保存文件?
- 在AWS S3的连接过程中发生java.lang.BootstrapMethodError: call site initialization exception