`

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 {
    -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_tableview设置背景透明和滚动条

    在JavaFX中,`TableView`是一个非常常用的组件,用于展示数据集合。然而,自定义其样式,特别是设置背景透明和滚动条透明,并不是一项简单的任务,因为JavaFX默认的CSS样式并不提供这样的选项。在本实例中,我们将...

    javafx 2.0 tableview 实例

    这个"javafx 2.0 tableview 实例"是一个很好的学习资源,它可以帮助开发者了解如何在JavaFX应用程序中有效地使用TableView。 首先,让我们详细了解一下JavaFX中的TableView组件。TableView是一个可定制的数据视图...

    基于JavaFx TableView的人员增删查改界面

    在JavaFX中,TableView是一个强大的组件,用于展示和操作数据集。这个教程或者项目"基于JavaFx TableView的人员增删查改界面"旨在教你如何利用JavaFX构建一个用户界面,该界面可以对人员数据进行基本的操作,如添加...

    javafx 2.0 tableView 实例

    在JavaFX 2.0版本中,`TableView`是一个核心的组件,用于展示结构化的数据集,类似于传统的电子表格。下面我们将深入探讨`TableView`的使用方法,包括数据列的绑定。 `TableView`是JavaFX中的一个视图类,它允许...

    JavaFX2.0_表格框TableView

    在JavaFX 2.0中,TableView是一种强大的控件,用于以表格的形式展示数据。它提供了灵活的布局和丰富的功能,使开发者能够轻松地构建数据驱动的用户界面。以下是关于JavaFX 2.0表格框TableView及其核心组件的详细解释...

    JavaFX tableview获取数据demo

    JavaFX的一个demo,带checkbox的tableview,选中一行获取所选中行的数据。

    JavaFX+Jfoenix 学习笔记(三)--TableView数据表格源码

    在"JavaFX+Jfoenix 学习笔记(三)--TableView数据表格源码"中,我们将重点讨论如何使用JavaFX的TableView组件结合JFoenix来展示和操作数据。TableView是JavaFX中的一个核心组件,它允许用户以表格的形式查看和操作...

    JavaFX TreeView数据库加载Node的实例

    JavaFX的TreeView组件是用于构建层次结构数据视图的强大工具,它可以用来展示树形结构的信息,如文件系统、组织结构等。在这个实例中,我们将深入探讨如何将数据库中的数据加载到JavaFX的TreeView中,创建一个动态的...

    JavaFX_TableView_Demo:JavaFX_TableView_Demo包括在表中添加按钮图片以及事件监听

    JavaFX 是一个用于构建桌面应用、移动应用和嵌入式系统的富客户端应用...通过这个示例,开发者可以学习到如何自定义TableView的列,添加动态行为,并且有效地处理用户输入,这对于开发复杂的数据驱动应用非常有帮助。

    tableView横向滚动

    在`viewDidLayoutSubviews`中,你需要更新UITableView的contentSize,使其等于所有单元格宽度之和。例如: ```swift override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() let ...

    JavaFX学习 自定义分页,工具栏,window

    NULL 博文链接:https://lujin55.iteye.com/blog/1747929

    tableView自动调节cell高度

    在实际应用中,我们经常需要让cell的高度根据其内容动态调整,以保证内容的完整展示,这也就是“tableView自动调节cell高度”的核心概念。本知识点主要讲解如何实现这一功能。 首先,为了使cell能自适应内容高度,...

    JavaFx+Mysql+SceneBuilder实现的学生成绩管理系统,是吸纳了增删改查,利用了tableview组件

    javafx连接mysql数据库实现的一个简单的学生成绩管理系统。...其中实现了tableview组件查询显示成绩。内附有数据库建表示例,代码较为清晰,基本能够满足javafx课程大作业要求。欢迎大家交流参考学习。123

    jAVAfx的增删改查demo文件

    在"jAVAfx的增删改查demo文件"中,我们可以深入学习如何利用JavaFX实现数据管理的基本操作:增加(Add)、删除(Delete)、修改(Modify)和查询(Query)。 1. **JavaFX基础** - JavaFX是Oracle JDK的一部分,...

    JAVAFX运用tableview制作通讯录系统

    新手写的,不是很好

    FxMarkdownEditor-基于JavaFx的Markdown编辑器

    对于Java开发者来说,深入研究`FxMarkdownEditor`的源码,不仅可以学习到如何使用JavaFX构建桌面应用,还可以了解到如何处理Markdown解析和渲染,甚至可能涉及自定义JavaFX组件或事件处理机制。这对于提升JavaFX和...

    javaFX TableView

    TableView修改表格行颜色,定制表格

    javafx tableview鼠标触发更新属性详解

    JavaFX TableView 鼠标触发更新属性详解 JavaFX 是一个基于 Java 的跨平台应用程序开发框架,TableView 是其一个重要的组件,用来显示和编辑表格数据。在实际开发中,我们经常需要使用鼠标触发事件来更新 TableView...

    TableViewSample

    在JavaFX中,TableView是一个强大的组件,用于展示结构化数据的列表。`TableViewSample`是一个典型的例子,展示了如何使用JavaFX绑定数据到...对于JavaFX的学习者和开发者而言,深入研究和实践此类示例是非常有价值的。

Global site tag (gtag.js) - Google Analytics