怎么让javafx选中表格中一行的表格视

javaFX tableView中嵌入_百度知道
javaFX tableView中嵌入
有哪位大神搞过javaFX表格中嵌入控件,且解决了嵌入控件后模型数据与表格数据的绑定(即修改表格数据后自动更新模型数据。)
搞了好几天了
继承tablecell类中的commitedit方法,没有用····尝试了自己重写commitedit方法··· 好像也没搞定。求指导
我有更好的答案
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代码
firstNameCol.setCellValueFactory(new Callback&TableColumn.CellDataFeatures&Person, String&, ObservableValue&String&&() {
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: Java代码
firstNameCol.setCellFactory(new Callback&TableColumn&Person, String&, TableCell&Person, String&&() {
public TableCell&Person, String& call( // 单元格内容
TableColumn&Person, String& arg0) {
return new TableCell&Person, String&() {
protected void updateItem(final String str,boolean arg1) {
super.updateItem(str, arg1);
if (arg1) {
setText(null);
setGraphic(null);
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代码
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去掉。 去掉行横线 Java代码
.table-view .table-row-cell {
-fx-background-insets: 0;
若想同时去掉没有数据的竖线 Java代码
.table-row-cell:empty .table-cell {
-fx-border-width: 0
若想对行进行操作,可以通过setRowFactory。如下面对行的双击进行操作 Java代码
tableView.setRowFactory(new Callback&TableView&T&, TableRow&T&&() {
public TableRow&T& call(TableView&T& param) {
return new TableRowControl();
class TableRowControl extends TableRow&T& {
public TableRowControl() {
this.setOnMouseClicked(new EventHandler&MouseEvent&() {
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显示就是按位置加了。 Java代码
tableView.getItems().add(selectedRow, newRecord);
newRecord一个新的对象,没赋值。 自定义TableCell一般都是重写updateItem方法。如果有需要在编辑做操作,可以重写startEdit,cancelEdit Java代码
public void startEdit() {
if (!this.getTableRow().isVisible()) {
super.startEdit();
if (checkBox == null) {
createCheckBox();
setText(null);
setGraphic(checkBox);
public void cancelEdit() {
super.cancelEdit();
setText(getItem().toString());
setGraphic(null);
可以看到,一旦点击编辑状态,则改变Cell里面的内容。一离开编辑就换成原本cell里面的内容。这样就可以显示的时候就是字符串,而编辑的时候就可以弄一个控件,如日历。 获取选中的TableColumn Java代码
table.getSelectionModel().getSelectedCells().get(0).getTableColumn()
table自带方法可以过滤column,也就是只显示哪些column Java代码
table.setTableMenuButtonVisible(true);
设置为true后,会出现一个加号的column,它可以对column进行过滤 table默认是只能选着一行的,如果想选着多行,设置SelectionMode,此时可以对选中的多个进行监听。 Java代码
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。它们主要处理选择事件,可以看它们的方法: Java代码
getSelectedIndex()
getSelectedItem()
selectedIndexProperty()
selectedItemProperty()
获取选中的item和索引。一个是获取其值,另一个是获取封装属性,用于bind变化。 Java代码
select(int index)
select(T obj)
selectFirst()
selectLast()
clearSelection()
clearSelection(int index)
这些方法都是操作选中。 Java代码
setSelectionMode(SelectionMode.MULTIPLE);
selectIndices(int index, int... indices)
selectRange(int start, int end)
MultipleSelectionModel则提供多选功能,并且提供多选的一些方法。 Java代码
select(int row, TableColumn&S,?& column)
selectAboveCell()
selectBelowCell()
selectLeftCell()
selectRightCell()
setCellSelectionEnabled(boolean value)
TableView.TableViewSelectionModel&S&是继承了MultipleSelectionModel,主要针对table的选中事件提供了一些方法。
首先很感谢你第一时间回答我的问题我现在把抽象问题具体化一下,如果我在tableview的某一列中加一个button,该button的响应事件为点击button,让button的text值在yes 和 no之间切换,我切换表格中内容的时候发现对应的ObservableList中button对应的数据并没有产生对应的修改,
专注培养IT技术人才
主营:PHP培训,JAVA培训,HTML5培训,UI培训,Linux培训,Python培训
每一列都是一个TableColumn,我们可以直接创建也可以在JavaFX Scene Builder中创建好。TableView的数据填充,需要一个ObservableList。其中需要一个类来做数据填充。
本回答被网友采纳
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。个人技术履历
JAVAFX的TableView的单元格可编辑
好吧,这个折腾了我好久。用javaFX写了一个表格,但是不能编辑单元格十分郁闷。
没有想到有一个很简单的方法就搞定我了。
masterTime.setCellFactory(TextFieldTableCell.forTableColumn());
直接设定TableColumn的CellFactory就可以,当然还有其他设定例如:
TableColumn invitedCol = new TableColumn();
invitedCol.setText("Invited");
invitedCol.setMinWidth(50);
invitedCol.setCellValueFactory(new PropertyValueFactory("invited"));
invitedCol.setCellFactory(new Callback&TableColumn, TableCell&() {
public TableCell call(
TableColumn p) {
return new CheckBoxTableCell();
这段是网上贴的,意思就是可以自己定义Cell的类型和样式。反正搞定之后效果就是这样的,哈哈。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!javafX8初探(树形表格)
本章描述TreeTableView用户组件,这个组件让你能够在列中设计可视化的无限制层级数据。
TreeTableView和TreeView和TableView有共同之处。它结合了两者的功能。
创建一个TreeTableView控件
一个基本的TreeTableView的实现可以按照下面的步骤:
1:创建TreeItem
2:创建根节点
3:添加TreeItem到根节点
4:创建一个或多列
5:定义单元格内容
6:创建TreeTableView
7:关联列和TreeTableView
import javafx.application.A
import javafx.beans.property.ReadOnlyStringW
import javafx.scene.G
import javafx.scene.S
import javafx.scene.control.TreeTableC
import javafx.scene.control.TreeTableColumn.CellDataF
import javafx.scene.control.TreeI
import javafx.scene.control.TreeTableV
import javafx.stage.S
public class TreeTableViewSample extends Application {
public static void main(String[] args) {
Application.launch(args);
public void start(Stage stage) {
stage.setTitle("Tree Table View Samples");
final Scene scene = new Scene(new Group(), 200, 400);
Group sceneRoot = (Group)scene.getRoot();
//Creating tree items
final TreeItem&String& childNode1 = new TreeItem&&("Child Node 1");
final TreeItem&String& childNode2 = new TreeItem&&("Child Node 2");
final TreeItem&String& childNode3 = new TreeItem&&("Child Node 3");
//Creating the root element
final TreeItem&String& root = new TreeItem&&("Root node");
root.setExpanded(true);
//Adding tree items to the root
root.getChildren().setAll(childNode1, childNode2, childNode3);
//Creating a column
TreeTableColumn&String,String& column = new TreeTableColumn&&("Column");
column.setPrefWidth(150);
//Defining cell content
column.setCellValueFactory((CellDataFeatures&String, String& p) -&
new ReadOnlyStringWrapper(p.getValue().getValue()));
//Creating a tree table view
final TreeTableView&String& treeTableView = new TreeTableView&&(root);
treeTableView.getColumns().add(column);
treeTableView.setPrefWidth(152);
treeTableView.setShowRoot(true);
sceneRoot.getChildren().add(treeTableView);
stage.setScene(scene);
stage.show();
创建了一个简单的树形视图,只有一列,很多时候我们需要多个列。
添加多个列
import java.util.A
import java.util.L
import javafx.application.A
import javafx.beans.property.ReadOnlyStringW
import javafx.beans.property.SimpleStringP
import javafx.scene.G
import javafx.scene.S
import javafx.scene.control.TreeTableC
import javafx.scene.control.TreeI
import javafx.scene.control.TreeTableV
import javafx.scene.image.I
import javafx.scene.image.ImageV
import javafx.scene.paint.C
import javafx.stage.S
public class TreeTableViewSample extends Application {
List&Employee& employees = Arrays.&Employee&asList(
new Employee("Ethan Williams", "ethan."),
new Employee("Emma Jones", "emma."),
new Employee("Michael Brown", "michael."),
new Employee("Anna Black", "anna."),
new Employee("Rodger York", "roger."),
new Employee("Susan Collins", "susan."));
private final ImageView depIcon = new ImageView (
new Image(getClass().getResourceAsStream("department.png"))
final TreeItem&Employee& root =
new TreeItem&&(new Employee("Sales Department", ""), depIcon);
public static void main(String[] args) {
Application.launch(TreeTableViewSample.class, args);
public void start(Stage stage) {
root.setExpanded(true);
employees.stream().forEach((employee) -& {
root.getChildren().add(new TreeItem&&(employee));
stage.setTitle("Tree Table View Sample");
final Scene scene = new Scene(new Group(), 400, 400);
scene.setFill(Color.LIGHTGRAY);
Group sceneRoot = (Group) scene.getRoot();
TreeTableColumn&Employee, String& empColumn =
new TreeTableColumn&&("Employee");
empColumn.setPrefWidth(150);
empColumn.setCellValueFactory(
(TreeTableColumn.CellDataFeatures&Employee, String& param) -&
new ReadOnlyStringWrapper(param.getValue().getValue().getName())
TreeTableColumn&Employee, String& emailColumn =
new TreeTableColumn&&("Email");
emailColumn.setPrefWidth(190);
emailColumn.setCellValueFactory(
(TreeTableColumn.CellDataFeatures&Employee, String& param) -&
new ReadOnlyStringWrapper(param.getValue().getValue().getEmail())
TreeTableView&Employee& treeTableView = new TreeTableView&&(root);
treeTableView.getColumns().setAll(empColumn, emailColumn);
sceneRoot.getChildren().add(treeTableView);
stage.setScene(scene);
stage.show();
public class Employee {
private SimpleStringP
private SimpleStringP
public SimpleStringProperty nameProperty() {
if (name == null) {
name = new SimpleStringProperty(this, "name");
public SimpleStringProperty emailProperty() {
if (email == null) {
email = new SimpleStringProperty(this, "email");
private Employee(String name, String email) {
this.name = new SimpleStringProperty(name);
this.email = new SimpleStringProperty(email);
public String getName() {
return name.get();
public void setName(String fName) {
name.set(fName);
public String getEmail() {
return email.get();
public void setEmail(String fName) {
email.set(fName);
你可以展示出表格菜单按钮,这样用户就可以根据个人需要来打开或关闭列。通过调用treeTableView.setTableMenuButtonVisble(true)
你也可以控制根节点是否显示,通过调用:treeTableView.setShowRoot(false);
管理选择模式
默认的选择模式是SelectionMode.SINGLE
我们可以使用下面的方法,来支持多选。
treeTableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
treeeTableView.getSelectionModel().setCellSelectionEnabled(true);
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!JavaFX中的TableView myTable = new TableView();怎么样添加列数据_百度知道
JavaFX中的TableView myTable = new TableView();怎么样添加列数据
TableColumn firstColumn = new TableColumn(&系统名称&);
TableColumn secondColumn = new TableColumn(&节点名称&);
TableColumn thirdColumn = new TableColumn(&测试结果&);
myTable.getColumns().addAll(firstColumn, se...
我有更好的答案
table.setItems(data); 这行
为您推荐:
其他类似问题
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&&() {
public ObservableValue&String& call(CellDataFeatures&Person, String& arg0) {
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&&() {
public TableCell&Person, String& call(
TableColumn&Person, String& arg0) {
return new TableCell&Person, String&() {
protected void updateItem(final String str,boolean arg1) {
super.updateItem(str, arg1);
if (arg1) {
setText(null);
setGraphic(null);
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"));
lastNameColumn = new TableColumn&Person, String&("Last");
lastNameColumn.setCellValueFactory(new PropertyValueFactory&Person, String&("lastName"));
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: 0
若想对行进行操作,可以通过setRowFactory。如下面对行的双击进行操作
tableView.setRowFactory(new Callback&TableView&T&, TableRow&T&&() {
public TableRow&T& call(TableView&T& param) {
return new TableRowControl();
class TableRowControl extends TableRow&T& {
public TableRowControl() {
this.setOnMouseClicked(new EventHandler&MouseEvent&() {
public void handle(MouseEvent event) {
if (event.getButton().equals(MouseButton.PRIMARY)
&& event.getClickCount() == 2
&& TableRowControl.this.getIndex() & tableView.getItems().size()) {
往table中插入数据,table中的数据显示,是根据你的itemlist来的,list里面的数据排什么序,那table也就排什么序。若添加一条新数据,直接往list里面加。而list又提供按位置加,那么table显示就是按位置加了。
tableView.getItems().add(selectedRow, newRecord);
newRecord一个新的对象,没赋值。 自定义TableCell一般都是重写updateItem方法。如果有需要在编辑做操作,可以重写startEdit,cancelEdit
public void startEdit() {
if (!this.getTableRow().isVisible()) {
super.startEdit();
if (checkBox == null) {
createCheckBox();
setText(null);
setGraphic(checkBox);
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的选中事件提供了一些方法。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 javafx 表格 的文章

 

随机推荐