TableView表 

构建一个表主要有TableView,TableColumn,ObservableList,Bean。
添加列table.getColumns().addAll(); 
ObservableList里面是存放的数据 
table.setItems(observableList);添加数据 
observableList里面一般是存放的Bean,列与Bean之间建立联系,从而获取值。

一、TableColumn列 

列与Bean之间建立联系: 
setCellValueFactory();
通过cell值工厂建立与Bean的联系。它这里并不需要知道你是传了什么Bean,它只需要通过“字段名”反射去Bean里面获得值,所以Bean属性定义的名字不需要与它相同,只需要有字段名Property() 方法。

setCellValueFactory(new PropertyValueFactory<Person, String>("字段名"));

TableColumn<Person,String> firstNameCol = new TableColumn<Person,String>("First Name");
firstNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("firstName"));

第二种设置方式

setCellValueFactory(new CallBack<T,S>());

setCellValueFactory(new CallBack<TableColumn.CellDataFeatures<Person, String>,ObservableValue<String>>()
@Overridepublic ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> cellData) {return new SimpleStringProperty(cellData.getValue().);}
);

TableColumn设置sort的3个方法

setSortNode(Node); // 默认是表头上的小图标三角形,可以改变 
setSortable(true); // 设置可排序

setSortType(SortType);//设置升降序 SortType.DESCENDING和SortType.ASCENDING

table.getSelectionModel().getSelectedCells().get(0).getTableColumn() // 获取选中的TableColumn
column中包含多个column,则可以调用TableColumn的getColumns().setAll(TableColumn...)

TableColumn<Person, String> firstNameColumn = new TableColumn<Person, String>("First");
firstNameColumn.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));
// firstNameColumn.setCellFactory(TextFieldCellFactory.<Person>forTableColumn());
TableColumn<Person, String> lastNameColumn = new TableColumn<Person, String>("Last");
lastNameColumn.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName"));
// lastNameColumn.setCellFactory(TextFieldCellFactory.<Person>forTableColumn());
TableColumn<Person, String> nameColumn = new TableColumn<Person, String>("Name");
nameColumn.getColumns().setAll(firstNameColumn, lastNameColumn);

二、TaleCell

对TableColumn的cell里面弄重新构造
setCellFactory(TextFieldTableCell.forTableColumn());有一些默认的构造。

setCellFactory(new Callback<TableColumn<Path, Number>, TableCell<Path, Number>>() {@Overridepublic TableCell<Path, Number> call(TableColumn<Path, Number> param) {return new MyTableCell<Path, Number>();  }
}

cell里面不仅只存放文字,还可以存放其它Node,需要重写TableCell的update(T t,boolean empty)方法编辑单元格可以使用重写startEdit()和cancelEdit()

class MyTableCell<Path, String> extends TableCell<Path, String> {protected void updateItem(Node node,boolean empty) {        super.updateItem(node, empty);  if (empty||node==null) {    //tableCell没有数据或者为空                       setText(null);  setGraphic(null);  else {                                setText(null);  setGraphic(node);  //设置Node} }@Overridepublic void startEdit() {super.startEdit();  // 设置编辑状态  //super.setGraphic(null);//super.setText(null);}@Overridepublic void cancelEdit() {super.cancelEdit();//退出编辑状态//super.setText(null);          // super.setGraphic(null);}
}

双击鼠标监听

通过tableColumn.setCellFactory(new TaskCellFactory());设置了CellFactory。

TaskCellFactory的内容如下:

class TaskCellFactory implements Callback<TableColumn<Task, String>, TableCell<Task, String>> {@Overridepublic TableCell<Task, String> call(TableColumn<Task, String> param) {TextFieldTableCell<Task, String> cell = new TextFieldTableCell<>();cell.setOnMouseClicked((MouseEvent t) -> {if (t.getClickCount() == 2) {//双击执行的代码}});      return cell;}
}

整个实现的核心就在于重点就在于实现Callback<TableColumn<Task, String>, TableCell<Task, String>>然后返回JavaFX API自带的TextFieldTableCell。并在call()方法中,为cell增加了双击事件的处理。

三、TableRow

通过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  }  }  });  }  }  

四、MenuButton

在JavaFx的 TableView 上可以使用MenuButton来管理TableView的Column.

启用MenuButton.

TableView.setTableMenuButtonVisible(true);

但是普通的MenuButton, 每次点击都会刷新TableView

重写TableMenuButton的事件

找到tableView 的 menuButton.
Node menuButton = tableView</span>.lookup(".show-hide-columns-button");
EventHandler<MouseEvent> mousePressedHandler = new EventHandler<MouseEvent>() {@Overridepublic void handle(MouseEvent event) {//可以增加文本菜单对TableColumn的控制//中止eventevent.consume();}
};
//增加menuButton的触发事件
menuButton.addEventFilter(MouseEvent.MOUSE_PRESSED,mousePressedHandler);

五、SelectionMode

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()   
selectFirst()   
selectLast()   
clearSelection()   
clearSelection(int index) 
selectIndices(int index, int... indices)   
selectRange(int start, int end)   
select(int index)   
select(T obj)   
setSelectionMode(SelectionMode.MULTIPLE);

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

selectAboveCell()   
selectBelowCell()  
selectLeftCell()   
selectRightCell()    
setCellSelectionEnabled(boolean value)   
select(int row, TableColumn<S,?> column)

选择变换监听

tableview.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
//tableview.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener() {  @Override  public void changed(ObservableValue observable,Object oldValue, Object newValue) {  system.out.println("selection change");  }
});  

六、TableView的FXCSS

特殊的table设置

TableView的单元之间去掉行横线

.table-view .table-row-cell {  -fx-background-insets: 0;
}  

TableView的单元之间去掉没有数据的竖线

table-row-cell:empty .table-cell {  -fx-border-width: 0px;
}  

TableView的单元之间去掉竖线

table-row-cell .table-cell {  -fx-border-width: 0px;
}  

TableView的TableColumn的列头设置

.table-view .column-header{-fx-border-color:white lightgray white white;
}

table的空闲的列头设置

.table-view .filler{-fx-background-color: white;
}

table的列首背景设置,其中包括column-header,filler,MenuButton

.table-view .column-header-background{   -fx-background-color: white;
}

/* remove double borders from scrollbars */

table的垂直滚动条设置

.table-view > .virtual-flow > .scroll-bar:vertical{-fx-background-insets: 0, 0 0 0 1;-fx-padding: -1 -1 -1 0;
}

table的水平滚动条设置

.table-view > .virtual-flow > .scroll-bar:horizontal{-fx-background-insets: 0, 1 0 0 0;-fx-padding: 0 -1 -1 -1;
}

table的边角设置

.table-view > .virtual-flow > .corner {-fx-background-color: derive(-fx-base,-1%); /*-fx-base 是modena 预先定义的颜色*/
}

/* Selected rows */

.table-view:focused > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled:selected{-fx-background: -fx-selection-bar;-fx-table-cell-border-color: derive(-fx-selection-bar, 20%);
}

/* Selected when control is not focused */

.table-row-cell:filled > .table-cell:selected{-fx-background: -fx-selection-bar-non-focused;-fx-table-cell-border-color: derive(-fx-selection-bar-non-focused, 20%);
}
/* focused cell (keyboard navigation) */
.table-view:focused:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell > .table-cell:focused{-fx-background-color: -fx-background, -fx-cell-focus-inner-border, -fx-background;-fx-background-insets: 0, 1, 2;
}

.table-view{/* Constants used throughout the tableview. */-fx-table-header-border-color: -fx-box-border;-fx-table-cell-border-color: derive(-fx-color,5%);
}

JavaFX之TableView相关推荐

  1. JavaFX之TableView的MenuButton

    MenuButton 在JavaFx的 TableView 上可以使用MenuButton来管理TableView的Column. 启用MenuButton. TableView.setTableMe ...

  2. JavaFX中TableView的使用

    稍微说说JavaFX里面TableView怎么用,(其实在JavaFX的源码中都有示例...) 首先要了解TableView是用来做什么的,TableView是JavaFX的一个表视图,用来显示表格的 ...

  3. JavaFX学习之道:JavaFX之TableView

     TableView表     TableColumn列  构建一个表主要有TableView,TableColumn,ObservableList,Bean.  加入列table.getColumn ...

  4. JavaFx之TableView表格操作----增删改及行多选

    最近因项目开发需要,需要开发一个小工具对项目设备进行管理,JavaFx作为java桌面程序开发的一个利器,成为首选. IDEA集成开发工具为我们提供开发JavaFx项目的环境,支持可视化编程,布局支持 ...

  5. java fx插入图片,javafx在tableview中添加图像

    我使用了你的代码但是使用了更新版本的Netbeans . 我还添加了一个String列 . import javafx.scene.image.ImageView; public class Cust ...

  6. JavaFX之TableView的SelectionMode

    SelectionMode table默认是只能选着一行的,如果想选着多行,设置SelectionMode,此时可以对选中的多个进行监听. [java] view plaincopy ListChan ...

  7. JavaFX之TableView的TableRow

    TableRow 通过TableView的setRowFactory,对行的双击进行操作 tableView.setRowFactory(new Callback<TableView<T& ...

  8. javafx之TableView的TaleCell

    TaleCell 对TableColumn的cell里面弄重新构造 TableColumn的setCellFactory(TextFieldTableCell.forTableColumn());有一 ...

  9. javafx之TableView的FXCSS

    TableView的FXCSS 一.特殊的table设置 TableView的单元之间去掉行横线 .table-view .table-row-cell { -fx-background-insets ...

最新文章

  1. 在论坛中出现的各种疑难问题:性能优化
  2. Python常见的内置函数
  3. cloud foundry部署报错TypeError: can't convert Hash into String
  4. 微信公众号开发(python+werobot)-自动回复
  5. 如何启用和关闭数据库的Oracle归档模式
  6. HTML 5 meta 标签
  7. Magicodes.IE Csv导入导出
  8. 构建自己的简单微服务架构(开源)
  9. mysql8.0 密码认证插件_只需使用VS Code的REST客户端插件即可进行API调用
  10. Kubernetes详解(二十七)——Deployment控制器回滚
  11. MacOS配置Sql Server环境
  12. 我们为什么要骑驴找马?
  13. 关于我考研的这一年随记 —— 2022暨南大学电子信息计算机技术专业初试第三复试第一
  14. diy服务器个人主机_DIY双路服务器之个人主机
  15. wpa_supplicant交叉编译
  16. android 实现广告弹窗,Android实现自适应屏幕的弹窗广告
  17. 随机游走模型 matlab,随机游走的matlab实现
  18. INTERCEPTOR DISCONNECTED 的问题
  19. java设计校园网登录界面_java毕业设计_springboot框架的校园网的大学生社交网站...
  20. webpack-dev-server的代理(proxy)

热门文章

  1. [Java基础]Stream流终结操作之forEachcount
  2. [蓝桥杯2015决赛]穿越雷区-bfs
  3. 添加库路经 linux,linux下的静态库与动态库
  4. oracle consistent gets,oracle构建一致性读
  5. 2019-02-21-算法-进化
  6. 【IOI2018】狼人【Kruscal重构树】【主席树】
  7. 【ZJOI2015】幻想乡战略游戏【点分树】【带权重心】
  8. 牛客题霸 [ 换钱的最少货币数] C++题解/答案
  9. 洛谷P3155:叶子的染色(树形dp)
  10. P3830-[SHOI2012]随机树【数学期望,dp】