javafx20表格框tableview.docx
《javafx20表格框tableview.docx》由会员分享,可在线阅读,更多相关《javafx20表格框tableview.docx(17页珍藏版)》请在冰豆网上搜索。
javafx20表格框tableview
JavaFX2.0表格框TableView
JavaFXSDKAPI在的好几个类都被设计来以表格形式呈现数据。
在JavaFX应用中创建表格的最重要类是TableView, TableColumn , 和TableCell 。
可以通过实现数据模型或者应用一个细胞工厂来产生表格。
表格的类提供了内置的功能来在必要的时候进行数据排序和重置大小。
Figure13-1 是一个典型的表格,用来呈现地址簿中的联系人信息。
Figure13-1TableSample
Descriptionof"Figure13-1TableSample"
创建Table
Example13-1 中的代码块创建了一个空表格,它带有3列。
然后被加入了应用的场景中。
Example13-1AddingaTable
importjavafx.application.Application;importjavafx.geometry.Insets;importjavafx.scene.Group;importjavafx.scene.Scene;importjavafx.scene.control.Label;importjavafx.scene.control.TableColumn;importjavafx.scene.control.TableView;importjavafx.scene.layout.VBox;importjavafx.scene.text.Font;importjavafx.stage.Stage;publicclassMainextendsApplication{privateTableViewtable=newTableView();publicstaticvoidmain(String[]args){launch(args);}@Overridepublicvoidstart(Stagestage){Scenescene=newScene(newGroup());stage.setTitle("TableViewSample");stage.setWidth(400);stage.setHeight(500);finalLabellabel=newLabel("AddressBook");label.setFont(newFont("Arial",20));TableColumnfirstNameCol=newTableColumn("FirstName");TableColumnlastNameCol=newTableColumn("LastName");TableColumnemailCol=newTableColumn("Email");table.getColumns().addAll(firstNameCol,lastNameCol,emailCol);finalVBoxvbox=newVBox();vbox.setSpacing(5);vbox.getChildren().addAll(label,table);vbox.setPadding(newInsets(10,0,0,10));((Group)scene.getRoot()).getChildren().addAll(vbox);stage.setScene(scene);stage.show();}}
表格控件是通过实例化TableView 类创建的。
在 Example13-1 中,它被加入到了VBox 布局容器中,然而,你可以直接把它加入应用场景中。
Example13-1 定义了三列来存储地址簿中的以下信息:
某个联系人的名和姓还有电邮地址。
列是用TableColumn 类创建的。
TableView 类的getColumns 方法把前面创建的列加入到表格中。
在应用中,可以用这个方法动态的添加和移除列。
编译运行的效果如下Figure13-2 .
Figure13-2TableWithoutData
Descriptionof"Figure13-2TableWithoutData"
可以通过调用setVisible 方法来管理列的可视性。
比如说,你应用的逻辑要求隐藏用户电邮地址,可以这样达到目的:
emailCol.setVisible(false) .
如果数据要求更复杂的数据呈现结构,可以创建内嵌的列。
比如,如果地址簿中的联系人有两个email账户,就需要两列来展示首选和次要地址了。
创建两个子列,然后在emailCol 上调用getColumns 方法,见 Example13-2 .
Example13-2CreatingNestedColumns
TableColumnfirstEmailCol=newTableColumn("Primary");TableColumnsecondEmailCol=newTableColumn("Secondary");emailCol.getColumns().addAll(firstEmailCol,secondEmailCol);
把这些代码加入到 Example13-1 ,然后编译运行,表格的呈现效果如 Figure13-3 .
Figure13-3TablewithNestedColumns
Descriptionof"Figure13-3TablewithNestedColumns"
尽管表格被加入到了应用中,标准标题依然显示的是"Nocontentintable"因为没定义数据。
为了不显示这个标题,可以使用setPlaceholder方法指定一个 Node 对象来显示在空表格中。
定义DataModel
当在JavaFX应用中创建表格时,最佳实践是实现一个定义了数据模型、提供了方法和字段的类来扩展表格的工作。
Example13-3 创建了一个Person类来定义地址簿中的数据。
Example13-3CreatingthePersonClass
publicstaticclassPerson{privatefinalSimpleStringPropertyfirstName;privatefinalSimpleStringPropertylastName;privatefinalSimpleStringPropertyemail;privatePerson(StringfName,StringlName,Stringemail){this.firstName=newSimpleStringProperty(fName);this.lastName=newSimpleStringProperty(lName);this.email=newSimpleStringProperty(email);}publicStringgetFirstName(){returnfirstName.get();}publicvoidsetFirstName(StringfName){firstName.set(fName);}publicStringgetLastName(){returnlastName.get();}publicvoidsetLastName(StringfName){lastName.set(fName);}publicStringgetEmail(){returnemail.get();}publicvoidsetEmail(StringfName){email.set(fName);}}
firstName , lastName , 和email 字符串属性(stringproperty)是创建来引用特定的数据元素的。
另外, get和 set方法是提供给每个数据元素的。
这样,比如说, getFirstName方法返回了firstName属性的值,而 setFirstName 方法为这个属性指定了值。
当数据模型在 Person 类中形成时,可以创建一个ObservableList 数组来定义足够多的行来在表格中显示你的数据。
看Example13-4 中的代码。
Example13-4DefiningTableDatainanObservableList
finalObservableListdata=FXCollections.observableArrayList(newPerson("Jacob","Smith","jacob.smith@"),newPerson("Isabella","Johnson","isabella.johnson@"),newPerson("Ethan","Williams","ethan.williams@"),newPerson("Emma","Jones","emma.jones@"),newPerson("Michael","Brown","michael.brown@"));
下一步是将数据和表格列相关联。
可以通过为每个数据元素定义的属性来实现,见Example13-5 .
Example13-5SettingDataPropertiestoColumns
firstNameCol.setCellValueFactory(newPropertyValueFactory("firstName"));lastNameCol.setCellValueFactory(newPropertyValueFactory("lastName"));emailCol.setCellValueFactory(newPropertyValueFactory("email"));
setCellValueFactory 方法为每列指定了一个细胞工厂。
细胞工厂是通过使用PropertyValueFactory 类来实现的,该类使用了表格列的firstName , lastName 和email 属性来引用Person相应的方法。
定义了数据模型、加入数据并和列相关联后可以把数据加入表格了。
使用TableView 类的setItems 方法:
table.setItems(data) .
由于ObservableList对象可以跟踪元素的任何改变, TableView的内容在数据改变后是自动更新的。
查看 Example13-6 中的代码。
Example13-6CreatingaTableandAddingDatatoIt
importjavafx.beans.property.SimpleStringProperty;importjavafx.scene.control.cell.PropertyValueFactory;importjavafx.application.Application;importjavafx.collections.FXCollections;importjavafx.collections.ObservableList;importjavafx.geometry.Insets;importjavafx.scene.Group;importjavafx.scene.Scene;importjavafx.scene.control.Label;importjavafx.scene.control.TableColumn;importjavafx.scene.control.TableView;importjavafx.scene.layout.VBox;importjavafx.scene.text.Font;importjavafx.stage.Stage;publicclassMainextendsApplication{publicstaticclassPerson{privatefinalSimpleStringPropertyfirstName;privatefinalSimpleStringPropertylastName;privatefinalSimpleStringPropertyemail;privatePerson(StringfName,StringlName,Stringemail){this.firstName=newSimpleStringProperty(fName);this.lastName=newSimpleStringProperty(lName);this.email=newSimpleStringProperty(email);}publicStringgetFirstName(){returnfirstName.get();}publicvoidsetFirstName(StringfName){firstName.set(fName);}publicStringgetLastName(){returnlastName.get();}publicvoidsetLastName(StringfName){lastName.set(fName);}publicStringgetEmail(){returnemail.get();}publicvoidsetEmail(StringfName){email.set(fName);}}privateTableViewtable=newTableView();privatefinalObservableListdata=FXCollections.observableArrayList(newPerson("Jacob","Smith","jacob.smith@"),newPerson("Isabella","Johnson","isabella.johnson@"),newPerson("Ethan","Williams","ethan.williams@"),newPerson("Emma","Jones","emma.jones@"),newPerson("Michael","Brown","michael.brown@"));publicstaticvoidmain(String[]args){launch(args);}@Overridepublicvoidstart(Stagestage){Scenescene=newScene(newGroup());stage.setTitle("TableViewSample");stage.setWidth(400);stage.setHeight(500);finalLabellabel=newLabel("AddressBook");label.setFont(newFont("Arial",20));TableColumnfirstNameCol=newTableColumn("FirstName");firstNameCol.setCellValueFactory(newPropertyValueFactory("firstName"));TableColumnlastNameCol=newTableColumn("LastName");lastNameCol.setCellValueFactory(newPropertyValueFactory("lastName"));TableColumnemailCol=newTableColumn("Email");emailCol.setMinWidth(200);emailCol.setCellValueFactory(newPropertyValueFactory("email"));table.setItems(data);table.getColumns().addAll(firstNameCol,lastNameCol,emailCol);finalVBoxvbox=newVBox();vbox.setSpacing(5);vbox.getChildren().addAll(label,table);vbox.setPadding(newInsets(10,0,0,10));((Group)scene.getRoot()).getChildren().addAll(vbox);stage.setScene(scene);stage.show();}}
编译运行的效果如图 Figure13-4 所示。
Figure13-4TablePopulatedwithData
Descriptionof"Figure13-4TablePopulatedwithData"
新增行
Figure13-4 中的表格包含了5行,目前还无法更改。
可以使用文本框来输入FirstName,LastName和Email列中的内容。
TextField控件使你的应用能够接收用户的输入。
Example13-7创建了三个文本框并分别定义了提示语,还创建了一个Add按钮。
Example13-7UsingTextFieldstoEnterNewItemsintheTable
finalTextFieldaddFirstName=newTextField();addFirstName.setPromptText("LastName");addFirstName.setMaxWidth(firstNameCol.getPrefWidth());finalTextFieldaddLastName=newTextField();addLastName.setMaxWidth(lastNameCol.getPrefWidth());addLastName.setPromptText("LastName");finalTextFieldaddEmail=newTextField();addEmail.setMaxWidth(emailCol.getPrefWidth());addEmail.setPromptText("Email");finalButtonaddButton=newButton("Add");addButton.setOnAction(newEventHandler(){@Overridepublicvoidhandle(ActionEvente){data.add(newPerson(addFirstName.getText(),addLastName.getText(),addEmail.getText()));addFirstName.setText("");addLastName.setText("");addEmail.setText("");}});
点击Add按钮后,文本框中的值就包含进一个Person 的构造方法并加入到data可见列表( observablelist)中。
这样 ,新输入的联系人信息就显示在表格中了。
查看 Example13-8 中的代码。
Example13-8TablewiththeTextFieldstoEnterNewItems
importjavafx.application.Application;importjavafx.beans.property.SimpleStringProperty;importjavafx.beans.property.StringProperty;importjavafx.collections.FXCollections;importjavafx.collections.ObservableList;importjavafx.event.ActionEvent;importjavafx.event.EventHandler;importjavafx.geometry.Insets;importjavafx.scene.Group;importjavafx.scene.Scene;importjavafx.scene.control.Button;importjavafx.scene.control.Label;importjavafx.scene.control.TableColumn;importjavafx.scene.control.TableView;importjavafx.scene.control.TextField;importjavafx.scene.control.cell.PropertyValueFactory;importjavafx.scene.layout.HBox;importjavafx.scene.layout.VBox;importjavafx.scene.text.Font;importjavafx.stage.Stage;publicclassMainextendsApplication{publicstaticclassPerson{privatefinalStringPropertyfirstName;privatefinalStringPropertylastName;privatefinalStringPropertyemail;privatePerson(StringfName,StringlName,Stringemail){this.firstName=newSimpleStringProperty(fName);this.lastName=newSimpleStringProperty(lName);this.email=newSimpleStringProperty(email);}p