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. lastNameColumn = new TableColumn<Person, String>("Last");
  5. lastNameColumn.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName"));
  6. //        lastNameColumn.setCellFactory(TextFieldCellFactory.<Person>forTableColumn());
  7. nameColumn = new TableColumn<Person, String>("Name");
  8. 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. public TableRowControl() {
  9. super();
  10. this.setOnMouseClicked(new EventHandler<MouseEvent>() {
  11. @Override
  12. public void handle(MouseEvent event) {
  13. if (event.getButton().equals(MouseButton.PRIMARY)
  14. && event.getClickCount() == 2
  15. && TableRowControl.this.getIndex() < tableView.getItems().size()) {
  16. //doSomething
  17. }
  18. }
  19. });
  20. }
  21. }

往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. if (checkBox == null) {
  8. createCheckBox();
  9. }
  10. setText(null);
  11. setGraphic(checkBox);
  12. }
  13. @Override
  14. public void cancelEdit() {
  15. super.cancelEdit();
  16. setText(getItem().toString());
  17. setGraphic(null);
  18. }

可以看到,一旦点击编辑状态,则改变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. selectionUpdated(c.getAddedSubList(), c.getRemoved());
  5. }
  6. }
  7. };
  8. tableView.getSelectionModel().getSelectedItems().addListener(indicesListener);
  9. 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/

JavaFX学习之道:JavaFX之TableView,布布扣,bubuko.com

时间: 2024-10-25 10:27:38

JavaFX学习之道:JavaFX之TableView的相关文章

JavaFx学习之道:JavaFx初步了解

因为项目的需要,实在是没有办法了,试了很多种方案(RCP,SWT,Flex,Smartinvoke...),最终还是决定开始研究JavaFx...为了给用户更好地体验我们的"智能家居"! 以下是最近搜索得到的一些资料: 1.Oracle 上 JavaFx的下载页面:http://www.oracle.com/technetwork/java/javafx/overview/index.html 目前最新版本的SDK是2.1 JavaFX 2.1 Developer Preview -

JavaFX学习之道:FileChooser 、POI导出Excel文件

以下是JavaFX中导出Excel的核心代码: private HSSFWorkbook workbook; /* Build Operation Button Area */ Button exportBn = ButtonBuilder.create().text("导出Excel").prefWidth(80).prefHeight(30).build(); exportBn.setDefaultButton(true); exportBn.setOnAction(new Eve

JavaFX学习之道:FXML入门

FXML是JavaFX 2.0提供的新技术.你可能会问"什么是FXML?","对我来说有什么用?". FXML是一种在JavaFX应用程序中定义用户界面的,基于XML的声明性标记语言.FXML非常适合用来静态布局,如表单.控件和表格.使用FXML,您还可以通过脚本动态地构建布局. FXML的优势之一是基于XML,是大多数开发人员所熟悉的,尤其是Web开发人员和使用其他RIA平台的开发人员.另一个优点是,FXML是不是编译语言,你不需要重新编译代码就可看到您所做的更改

JavaFX学习之道:JavaFX API详解之Window,Stage,PopupWindow

stage包中包含 Window, Stage, PopupWindow, Popup, FileChooser, DirectoryChooser, Screen等类. 其中Window类可理解成一个窗体,用于存放Scene,并与用户操作.一般window作为窗体,都用其子类Stage和PopupWindow. 看一下Window作为窗体的顶级类包含的一些共同属性 eventDispatcher setEventDispatcher(EventDispatcher value) focused

JavaFX学习之道:详解JavaFX架构与框架

JavaFX 2.0平台是基于Java技术的富客户端平台.它使应用程序开发者更加容易的开发和部署跨平台的富互联网应用(RIA).JavaFX 2.0文档包含了JavaFX 2.0所提供的功能的概述. 图1描述了JavaFX 2.0平台的架构组件.后面的部分将对每一个组件进行逐一的描述.在JavaFX通用API的下面是用来运行JavaFX代码的引擎.这个引擎包括以下子组件:JavaFX高性能图形引擎(Prism);新的更小但更有效率的窗体系统(Glass);媒体引擎和Web引擎.虽然这些组件不是包

JavaFX学习之道:文本框TextField

原文地址http://download.oracle.com/javafx/2.0/ui_controls/text-field.htm TextField类实现了一种可以接受和显示文本输入的UI控件,它提供了接受用户输入的功能.和另一个文本输入控件PasswordField一起都继承了TextInput这个类,TextInput是所有文本控件的父类. Figure 8-1 是一个带有标签的典型文本框. Figure 8-1 Label and Text Field Description of

JavaFX学习之道:文本Text及其特效

原文地址http://download.oracle.com/javafx/2.0/text/jfxpub-text.htm 文本讲述如何在JavaFX2.0应用中加入文本和如何为文本提供花俏的效果. 引子 JavaFX 2.0应用的图形内容包含一些对象,它们被组织在一个成为场景图的类树结构中.场景图中的每个元素成为一个结点,结点可以管理很多不同种类的内容,包括文本.结点可以转换和移动,也可以应用多种效果.为所有结点类型使用共同特点使得可以提供复杂的文本内容来满足现在的富网络应用(RIAs).

JavaFX学习之道:使用JavaFX2.0的属性和绑定

目录(?)[+]                                     (原文:斯科特霍梅尔/甲骨文高级技术专家) 原文地址:http://docs.oracle.com/javafx/2/binding/jfxpub-binding.htm 本教程通过一些可以编译和运行的例子描述了JavaFX的属性和绑定.关于JavaFX的安装,请参阅JavaFX安装指南. 概述 很多年以来,Java语言一直使用JavaBean来表示对象的属性,这种模式既包含API,也包含设计模式,它已经广

JavaFX学习之道:File Chooser

This chapter explains how to use the FileChooser class to enable users to navigate the file system. The samples provided in this chapter explain how to open one or several files, configure a file chooser dialog window, and save the application conten