java tableview_JavaFX学习之道:JavaFX之TableView

emailCol.setCellValueFactory(new PropertyValueFactory("email"));通过cell值工厂建立与Bean的联系。它这里并不须要知道你是传了什么Bean,它仅仅须要通过“email”反射成getEmail()方法去Bean里面获得值,所以Bean属性定义的名字不须要与它同样,仅仅须要有getEmail()方法。

Java代码  68b8c990fb8b9dab4119eb149d2bc2f8.png

firstNameCol.setCellValueFactory(new Callback, ObservableValue>() {

@Override

public ObservableValue call(CellDataFeatures 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:

Java代码  68b8c990fb8b9dab4119eb149d2bc2f8.png

firstNameCol.setCellFactory(new Callback, TableCell>() {

@Override

public TableCell call( // 单元格内容

TableColumn arg0) {

return new TableCell() {                @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...);

Java代码  68b8c990fb8b9dab4119eb149d2bc2f8.png

firstNameColumn = new TableColumn("First");

firstNameColumn.setCellValueFactory(new PropertyValueFactory("firstName"));

//        firstNameColumn.setCellFactory(TextFieldCellFactory.forTableColumn());

lastNameColumn = new TableColumn("Last");

lastNameColumn.setCellValueFactory(new PropertyValueFactory("lastName"));

//        lastNameColumn.setCellFactory(TextFieldCellFactory.forTableColumn());

nameColumn = new TableColumn("Name");

nameColumn.getColumns().setAll(firstNameColumn, lastNameColumn);

table的单元之间有明显的横线切割,能够通过css去掉。

去掉行横线

Java代码  68b8c990fb8b9dab4119eb149d2bc2f8.png

.table-view .table-row-cell {

-fx-background-insets: 0;

}

若想同一时候去掉没有数据的竖线

Java代码  68b8c990fb8b9dab4119eb149d2bc2f8.png

.table-row-cell:empty .table-cell {

-fx-border-width: 0px;

}

若想对行进行操作,能够通过setRowFactory。如以下对行的双击进行操作

Java代码  68b8c990fb8b9dab4119eb149d2bc2f8.png

tableView.setRowFactory(new Callback, TableRow>() {

@Override

public TableRow call(TableView param) {

return new TableRowControl();

}

});

class TableRowControl extends TableRow {

public TableRowControl() {

super();

this.setOnMouseClicked(new EventHandler() {

@Override

public void handle(MouseEvent event) {

if (event.getButton().equals(MouseButton.PRIMARY)

&& event.getClickCount() == 2

&& TableRowControl.this.getIndex() 

//doSomething

}

}

});

}

}

往table中插入数据。table中的数据显示,是依据你的itemlist来的。list里面的数据排什么序,那table也就排什么序。若加入一条新数据,直接往list里面加。

而list又提供按位置加,那么table显示就是按位置加了。

Java代码  68b8c990fb8b9dab4119eb149d2bc2f8.png

tableView.getItems().add(selectedRow, newRecord);

newRecord一个新的对象,没赋值。

自己定义TableCell一般都是重写updateItem方法。假设有须要在编辑做操作,能够重写startEdit,cancelEdit

Java代码  68b8c990fb8b9dab4119eb149d2bc2f8.png

@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

Java代码  68b8c990fb8b9dab4119eb149d2bc2f8.png

table.getSelectionModel().getSelectedCells().get(0).getTableColumn()

table自带方法能够过滤column,也就是仅仅显示哪些column

Java代码  68b8c990fb8b9dab4119eb149d2bc2f8.png

table.setTableMenuButtonVisible(true);

设置为true后,会出现一个加号的column,它能够对column进行过滤

table默认是仅仅能选着一行的,假设想选着多行。设置SelectionMode,此时能够对选中的多个进行监听。

Java代码  68b8c990fb8b9dab4119eb149d2bc2f8.png

ListChangeListener indicesListener = new   ListChangeListener() {

@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。

它们主要处理选择事件,能够看它们的方法:

Java代码  68b8c990fb8b9dab4119eb149d2bc2f8.png

getSelectedIndex()

getSelectedItem()

selectedIndexProperty()

selectedItemProperty()

获取选中的item和索引。一个是获取其值,还有一个是获取封装属性,用于bind变化。

Java代码  68b8c990fb8b9dab4119eb149d2bc2f8.png

select(int index)

select(T obj)

selectFirst()

selectLast()

...

clearSelection()

clearSelection(int index)

这些方法都是操作选中。

Java代码  68b8c990fb8b9dab4119eb149d2bc2f8.png

setSelectionMode(SelectionMode.MULTIPLE);

selectIndices(int index, int... indices)

selectRange(int start, int end)

MultipleSelectionModel则提供多选功能,而且提供多选的一些方法。

Java代码  68b8c990fb8b9dab4119eb149d2bc2f8.png

select(int row, TableColumn

> column)

selectAboveCell()

selectBelowCell()

selectLeftCell()

selectRightCell()

setCellSelectionEnabled(boolean value)

TableView.TableViewSelectionModel是继承了MultipleSelectionModel,主要针对table的选中事件提供了一些方法。

这里有非常多javafx的小游戏,一个高手写的

http://lustrezhang.gotoip4.com/fxgame/

这里有个javafx学习的中文站点,我把内容都丢那上面去了。

http://www.jfxee.com/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaFX TableView 的文本对齐方式可以通过设置 TableCell 的对齐方式来实现。具体方法如下: 1.创建一个继承自 TableCell 类的自定义单元格类。 ```java class AlignTableCell<T> extends TableCell<T, String> { public AlignTableCell() { super(); setTextAlignment(TextAlignment.CENTER); // 设置默认文本对齐方式 } @Override protected void updateItem(String item, boolean empty) { super.updateItem(item, empty); if (item != null && !empty) { setText(item); } else { setText(null); } } } ``` 2.在 TableView 中设置列的单元格工厂,使用自定义单元格类创建单元格。 ```java TableColumn<Person, String> nameColumn = new TableColumn<>("Name"); nameColumn.setCellValueFactory(new PropertyValueFactory<>("name")); nameColumn.setCellFactory(col -> new AlignTableCell<>()); // 设置单元格工厂 tableView.getColumns().add(nameColumn); ``` 3.在自定义单元格类中根据需要设置不同的对齐方式。 ```java class AlignTableCell<T> extends TableCell<T, String> { public AlignTableCell() { super(); setTextAlignment(TextAlignment.CENTER); // 设置默认文本对齐方式 } @Override protected void updateItem(String item, boolean empty) { super.updateItem(item, empty); if (item != null && !empty) { setText(item); switch (getIndex()) { // 根据列的索引设置不同的对齐方式 case 0: setTextAlignment(TextAlignment.LEFT); break; case 1: setTextAlignment(TextAlignment.CENTER); break; case 2: setTextAlignment(TextAlignment.RIGHT); break; } } else { setText(null); } } } ``` 这样就可以实现 JavaFX TableView 的文本对齐方式了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值