答:作为JavaWeb出身离不开数据表格的支持,比如JqGrid(叫表格控件的更准确些吧,但我习惯叫它数据表格),
在Web端通常用来将一个集合的数据用表格的形式展现出来,TableView做的也是这样的事情。
答:没有(或者说我用的简单没发现不同),所以如果你了解Web端的数据表格,那么TableViewh核心思想你以知晓。
答:并没有,如果有的话我想我会优先考虑的,但其实JavaFX的TableView已经够用了,实在不行自己也可以重写。
多说一句:Jfoenbix有重写TreeTableView(树结构数据表格),叫做JFXTreeTableView(标准的Jfoenix组件命名方式JFX打头)。
如果说了半天你还是不知道什么是数据表格,那么说明你刚入行吧,请看下面的案例
package zkh.javafx.learn.tableview;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import zkh.javafx.util.Constants;
/**
* TableView
*/
//继承javafx.application.Application是JavaFX的开始
public class TableView1 extends Application {
// 我们的主角--数据表格
private TableView table = new TableView();
// 我们的配角--数据
private ObservableList data = FXCollections.observableArrayList(
new Person("1", "张三"),
new Person("2", "李四"),
new Person("3", "王五")
);
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public void start(Stage stage) {
// (如果需要的话)定位横纵坐标,避免太靠边上遮盖菜单栏,,这两行如果不屑,一般电脑默认是居中屏幕显示,但在有些电脑会跑偏
// stage.setX(0);stage.setY(4);
// stage和Scene不再注释
stage.setTitle(Constants.TITLE);
stage.getIcons().add(new Image(Constants.IMG + "icon.png"));
// 下面才是本章需要关注的代码======================================================================
// 我们创建一个两列的数据表格
// 创建第一列,列名叫ID
TableColumn idColumn = new TableColumn("ID");
// (很有用),指定该列可编辑(你双击后会显示文本框,修改后回车(Enter)保存)
idColumn.setCellFactory(TextFieldTableCell.forTableColumn());
// 设置列的最小宽度(列的宽度只能设置首选宽度或最小宽度)
idColumn.setMinWidth(100);
// 指定第一列显示Person对象id属性的值
idColumn.setCellValueFactory(new PropertyValueFactory
效果图:
其中ID列时刻编辑的,因为我们设置了这个:setCellFactory(TextFieldTableCell.forTableColumn())
还有列排序什么的默认就有这特性
来个暗黑版(我比较喜欢暗黑界面)怎么样?我们重写下它的样式,给他换个装扮
package zkh.javafx.learn.tableview;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import zkh.javafx.util.Constants;
/**
* TableView
*/
//继承javafx.application.Application是JavaFX的开始
public class TableView2 extends Application {
// 我们的主角--数据表格
private TableView table = new TableView();
// 我们的配角--数据
private ObservableList data = FXCollections.observableArrayList(
new Person("1", "张三"),
new Person("2", "李四"),
new Person("3", "王五")
);
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public void start(Stage stage) {
// (如果需要的话)定位横纵坐标,避免太靠边上遮盖菜单栏,,这两行如果不屑,一般电脑默认是居中屏幕显示,但在有些电脑会跑偏
// stage.setX(0);stage.setY(4);
// stage和Scene不再注释
stage.setTitle(Constants.TITLE);
stage.getIcons().add(new Image(Constants.IMG + "icon.png"));
// 下面才是本章需要关注的代码======================================================================
// 我们创建一个两列的数据表格
// 创建第一列,列名叫ID
TableColumn idColumn = new TableColumn("ID");
// (很有用),指定该列可编辑(你双击后会显示文本框,修改后回车(Enter)保存)
idColumn.setCellFactory(TextFieldTableCell.forTableColumn());
// 设置列的最小宽度(列的宽度只能设置首选宽度或最小宽度)
idColumn.setMinWidth(100);
// 指定第一列显示Person对象id属性的值
idColumn.setCellValueFactory(new PropertyValueFactory("id"));
// 创建第二列,列名叫NAME
TableColumn nameColumn = new TableColumn("NAME");
// 设置列的最小宽度(列的宽度只能设置首选宽度或最小宽度)
nameColumn.setMinWidth(200);
// 指定第二列显示Person对象name属性的值
nameColumn.setCellValueFactory(new PropertyValueFactory("name"));
// 将数据存入数据列表
table.setItems(data);
// 将我们创建的列添加进数据表格
table.getColumns().addAll(idColumn, nameColumn);
// 设置可编辑(列需要同时设置才有用)
table.setEditable(true);
// (很有用)宽度绑定窗口的宽度(意思窗口大小改变,它也跟着改变,自适应效果)
table.prefWidthProperty().bind(stage.widthProperty());
// 1、初始化一个场景
Scene scene = new Scene(table, 800, 600);
// 样式文件最好在Scene中引入,这样其他子组件就都可以使用了(哲理注意替换斜杠\,不能会报错找不到路径)
scene.getStylesheets().add((Constants.CSS + "app.css").replace("\\", "/"));
// 2、将场景放入窗口
stage.setScene(scene);
// 3、打开窗口
stage.show();
}
public static void main(String[] args) {
launch(args);
}
// 这是我们数据里的对象--配角的配角
public static class Person {
private SimpleStringProperty id;
private SimpleStringProperty name;
private Person(String ssPid, String sspName) {
this.id = new SimpleStringProperty(ssPid);
this.name = new SimpleStringProperty(sspName);
}
public String getId() {
return id.get();
}
public void setId(String ssPid) {
id.set(ssPid);
}
public String getName() {
return name.get();
}
public void setName(String sspName) {
name.set(sspName);
}
}
}
效果图:
具体步骤如下:
第一步:在实例-1中的代码其他不变只需加入这个行代码
scene.getStylesheets().add((Constants.CSS + "app.css").replace("\\", "/"));
第二步:app.css中重写原始样式如下
/*数据表格原始样式重写*/
.table-cell{ /*table行中列*/
-fx-text-fill:#C1C1C1;
-fx-background-color:#252526;
-fx-border-color:#414141;
-fx-border-width:1 1 0 1;
}
.table-row-cell{ /*table行*/
-fx-padding:0;
-fx-background-color:#252526;
-fx-border-color:#414141;
-fx-border-width:1 1 0 1;
-fx-background-insets: 0, 0 0 1 0;
}
.table-view .column-header,
.table-view .filler,
.table-view > .column-header-background > .show-hide-columns-button,
.table-view:constrained-resize .filler{ /*table头部*/
-fx-background-color:#252526;
}
.table-view .column-header .label{ /*table头部标题*/
-fx-text-fill:#C1C1C1;
}
.table-view /*> column-header-background > nested-column-header >*/ .arrow{ /*table排序图标*/
-fx-background-color: #C1C1C1;
}
那怎么给数据表格里动态添加数据呢,比如利用【添加】按钮来添加
顺带秀了下Jfoenix的按钮JFXButton的用法
package zkh.javafx.learn.tableview;
import com.jfoenix.controls.JFXButton;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.image.Image;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import zkh.javafx.util.Constants;
/**
* TableView
*/
//继承javafx.application.Application是JavaFX的开始
public class TableView3 extends Application {
// 我们的主角--数据表格
private TableView table = new TableView();
// 我们的配角--数据
private ObservableList data = FXCollections.observableArrayList(
new Person("1", "张三"),
new Person("2", "李四"),
new Person("3", "王五")
);
// 配角参数
private int id = 1;
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public void start(Stage stage) {
// (如果需要的话)定位横纵坐标,避免太靠边上遮盖菜单栏,,这两行如果不屑,一般电脑默认是居中屏幕显示,但在有些电脑会跑偏
// stage.setX(0);stage.setY(4);
// stage和Scene不再注释
stage.setTitle(Constants.TITLE);
stage.getIcons().add(new Image(Constants.IMG + "icon.png"));
// 下面才是本章需要关注的代码======================================================================
// 我们创建一个两列的数据表格
// 创建第一列,列名叫ID
TableColumn idColumn = new TableColumn("ID");
// (很有用),指定该列可编辑(你双击后会显示文本框,修改后回车(Enter)保存)
idColumn.setCellFactory(TextFieldTableCell.forTableColumn());
// 设置列的最小宽度(列的宽度只能设置首选宽度或最小宽度)
idColumn.setMinWidth(100);
// 指定第一列显示Person对象id属性的值
idColumn.setCellValueFactory(new PropertyValueFactory("id"));
// 创建第二列,列名叫NAME
TableColumn nameColumn = new TableColumn("NAME");
// 设置列的最小宽度(列的宽度只能设置首选宽度或最小宽度)
nameColumn.setMinWidth(200);
// 指定第二列显示Person对象name属性的值
nameColumn.setCellValueFactory(new PropertyValueFactory("name"));
// 将数据存入数据列表
table.setItems(data);
// 将我们创建的列添加进数据表格
table.getColumns().addAll(idColumn, nameColumn);
// 设置可编辑(列需要同时设置才有用)
table.setEditable(true);
// (很有用)宽度绑定窗口的宽度(意思窗口大小改变,它也跟着改变,自适应效果)
table.prefWidthProperty().bind(stage.widthProperty());
// 这段主要是为了加按钮===========================================================================
// 既然要添加按钮了,我们就用下Hbox布局(内部元素竖排,类似于HTML的块级元素)吧
VBox hbox = new VBox();
Button addButton = new Button("添加");
addButton.setOnAction(new EventHandler(){
public void handle(ActionEvent event) {
data.add(new Person(("id" + (++id)), "name"+ (++id)));
}
});
// (这个与本例的中心思想没啥关系,我会在以后的文章中穿插讲一些css的用法)顺便秀一下JFX的按钮
JFXButton addJFXButton = new JFXButton("添加");
addJFXButton.getStyleClass().add("button-raised");
addJFXButton.setOnAction(new EventHandler(){
public void handle(ActionEvent event) {
data.add(new Person(("id" + (++id)), "name"+ (++id)));
}
});
hbox.getChildren().addAll(table, addButton, addJFXButton);
// 这段主要是为了加按钮===========================================================================
// 1、初始化一个场景
Scene scene = new Scene(hbox, 800, 600);
// 样式文件最好在Scene中引入,这样其他子组件就都可以使用了(哲理注意替换斜杠\,不能会报错找不到路径)
scene.getStylesheets().add((Constants.CSS + "app.css").replace("\\", "/"));
// 2、将场景放入窗口
stage.setScene(scene);
// 3、打开窗口
stage.show();
}
public static void main(String[] args) {
launch(args);
}
// 这是我们数据里的对象--配角的配角
public static class Person {
private SimpleStringProperty id;
private SimpleStringProperty name;
private Person(String ssPid, String sspName) {
this.id = new SimpleStringProperty(ssPid);
this.name = new SimpleStringProperty(sspName);
}
public String getId() {
return id.get();
}
public void setId(String ssPid) {
id.set(ssPid);
}
public String getName() {
return name.get();
}
public void setName(String sspName) {
name.set(sspName);
}
}
}
效果图:
本例相较于实例-2主要多了下面这段代码
// 这段主要是为了加按钮===========================================================================
// 既然要添加按钮了,我们就用下Hbox布局(内部元素竖排,类似于HTML的块级元素)吧
VBox hbox = new VBox();
Button addButton = new Button("添加");
addButton.setOnAction(new EventHandler(){
public void handle(ActionEvent event) {
data.add(new Person(("id" + (++id)), "name"+ (++id)));
}
});
// (这个与本例的中心思想没啥关系,我会在以后的文章中穿插讲一些css的用法)顺便秀一下JFX的按钮
JFXButton addJFXButton = new JFXButton("添加");
addJFXButton.getStyleClass().add("button-raised");
addJFXButton.setOnAction(new EventHandler(){
public void handle(ActionEvent event) {
data.add(new Person(("id" + (++id)), "name"+ (++id)));
}
});
hbox.getChildren().addAll(table, addButton, addJFXButton);
// 这段主要是为了加按钮===========================================================================
注意这个就是按钮事件的用法,后面可能会写文章专门讲,也可能太简单就不讲了
addButton.setOnAction(new EventHandler(){
public void handle(ActionEvent event) {
data.add(new Person(("id" + (++id)), "name"+ (++id)));
}
});
还有秀的那个Jfoenix按钮的自定义样式
/*JFX默认按钮*/
.button-raised{
-fx-padding:0.5em 0.5em;
-fx-font-size:14;
-jfx-button-type:RAISED;
-fx-background-color:rgb(77, 102, 204);
-fx-pref-width:100;
-fx-text-fill:#FFFFFF;
-fx-spacing:0.25em;
}
JavaFX+Jfoenix 学习笔记(三)--TableView数据表格源码
好了,有什么不懂看注释,我相信我的注释!