javafx怎么通过表格组件做一个课程表的界面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javafx怎么通过表格组件做一个课程表的界面相关的知识,希望对你有一定的参考价值。

参考技术A 表格组件应该做不了课程表吧,我写过一个课程表是用GridPane来做的,只要把该界面布局的边框线设置成可见就行,但是界面比较丑,javafx在界面方面还是有很多限制,没办法像html+css那样做的精致漂亮。 参考技术B word中插入表格后“表格”“绘制斜线表头”选择样式二并在右边分别输入标题名称后确定即可

javaFX tableView中嵌入

有哪位大神搞过javaFX表格中嵌入控件,且解决了嵌入控件后模型数据与表格数据的绑定(即修改表格数据后自动更新模型数据。) 搞了好几天了 继承tablecell类中的commitedit方法,没有用····尝试了自己重写commitedit方法··· 好像也没搞定。求指导

每一列都是一个TableColumn,我们可以直接创建也可以在JavaFX Scene Builder中创建好。
TableView的数据填充,需要一个ObservableList。其中需要一个类来做数据填充。
参考技术A 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>>()
@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:

Java代码
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...);

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: 0px;


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

Java代码
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显示就是按位置加了。

Java代码
tableView.getItems().add(selectedRow, newRecord);

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

自定义TableCell一般都是重写updateItem方法。如果有需要在编辑做操作,可以重写startEdit,cancelEdit

Java代码
@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代码
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对应的数据并没有产生对应的修改,

以上是关于javafx怎么通过表格组件做一个课程表的界面的主要内容,如果未能解决你的问题,请参考以下文章

"C语言课程设计--算术计算器的实现"怎么做

第十一周课程总结

如何为角度课程设置播放器?

Java语言课程设计

第十二周课程总结

C语言课程设计,贪吃蛇应该怎么做?