[英]Populating TableView In JavaFX with TableView created in FXML File
我是JavaFX和Java的新手。 伙计们,您可以找出缺少的代码,因为我已经可以使用println函数从数据库中打印项目了。
public class TableViewController implements Initializable{
@FXML
private TableView<studentInfo> tblViewer = new TableView<studentInfo>();
@FXML
private TableColumn colID = new TableColumn();
@FXML
private TableColumn colName = new TableColumn();
@FXML
private TableColumn colAddress = new TableColumn();
@FXML
private TableColumn colAge = new TableColumn();
@FXML
private TableColumn colContact = new TableColumn();
@FXML
private Button cmdTest;
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
System.out.println("READ");
System.out.println(this.getClass().getSimpleName() + ".initialize");
cmdTest.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Button Pressed");
colID.setCellValueFactory(new PropertyValueFactory<studentInfo, Integer>("id"));
colName.setCellValueFactory(new PropertyValueFactory<studentInfo, String>("name"));
colAddress.setCellValueFactory(new PropertyValueFactory<studentInfo, String>("address"));
colAge.setCellValueFactory(new PropertyValueFactory<studentInfo, Integer>("age"));
colContact.setCellValueFactory(new PropertyValueFactory<studentInfo, String>("contact_num"));
tblViewer.getItems().setAll(getAllstudentInfo());
//tblViewer.getColumns().addAll(colID, colName, colAddress, colAge, colContact);
//System.out.println(tblViewer.getItems().setAll(getAllstudentInfo()));
}
} );
}
public class studentInfo{
private final SimpleIntegerProperty idCol;
private final SimpleStringProperty nameCol;
private final SimpleStringProperty addressCol;
private final SimpleIntegerProperty ageCol;
private final SimpleStringProperty contact_numCol;
public studentInfo(Integer id, String name, String address, Integer age, String contact_num){
this.idCol = new SimpleIntegerProperty(id);
this.nameCol = new SimpleStringProperty(name);
this.addressCol = new SimpleStringProperty(address);
this.ageCol = new SimpleIntegerProperty(age);
this.contact_numCol = new SimpleStringProperty(contact_num);
}
public Integer getidCol(){
return idCol.get();
}
public void setidCol(Integer id){
idCol.set(id);
}
public String getnameCol(){
return nameCol.get();
}
public void setnameCol(String name){
nameCol.set(name);
}
public String getaddressCol(){
return addressCol.get();
}
public void setaddressCol(String address){
addressCol.set(address);
}
public Integer getageCol(){
return ageCol.get();
}
public void setageCol(Integer age){
ageCol.set(age);
}
public String getcontact_numCol(){
return contact_numCol.get();
}
public void setcontact_numCol(String contact_num){
contact_numCol.set(contact_num);
}
}
public List<studentInfo> getAllstudentInfo(){
Connection conn;
List ll = new LinkedList();
Statement st;
ResultSet rs;
String url = "jdbc:mysql://localhost/java_test";
String user = "root";
String pass = "";
String driver = "com.mysql.jdbc.Driver";
try{
Class.forName(driver);
conn = DriverManager.getConnection(url, user, pass);
st = conn.createStatement();
String recordQuery = ("Select * from student");
rs = st.executeQuery(recordQuery);
while(rs.next()){
Integer id = rs.getInt("id");
String name = rs.getString("name");
String address = rs.getString("address");
Integer age = rs.getInt("age");
String contact_num = rs.getString("contact_num");
ll.add(new studentInfo(id, name, address, age, contact_num));
System.out.println(id +","+ name +","+ address +","+ age +","+ contact_num +" "+"added.");
}
}catch(ClassNotFoundException | SQLException ex){
Logger.getLogger(TableViewController.class.getName()).log(Level.SEVERE, null, ex);
}
return ll;
}
这是FXML文件:
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" prefHeight="594.0" prefWidth="838.0" xmlns:fx="http://javafx.com/fxml" fx:controller="loadingcsvtotableview.TableViewController">
<children>
<TableView fx:id="tblViewer" prefHeight="521.0" prefWidth="808.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="15.0" AnchorPane.rightAnchor="15.0" AnchorPane.topAnchor="59.0">
<columns>
<TableColumn prefWidth="75.0" text="ID" fx:id="colID" />
<TableColumn prefWidth="175.0" text="Name" fx:id="colName" />
<TableColumn prefWidth="330.0" text="Address" fx:id="colAddress" />
<TableColumn prefWidth="75.0" text="Age" fx:id="colAge" />
<TableColumn prefWidth="150.0" text="Contact Number" fx:id="colContact" />
</columns>
</TableView>
<Button fx:id="cmdExport" layoutX="14.0" mnemonicParsing="false" prefHeight="30.0" prefWidth="112.0" text="Export Data" AnchorPane.topAnchor="21.0" />
<Button fx:id="cmdClose" layoutX="144.0" mnemonicParsing="false" prefHeight="30.0" prefWidth="112.0" text="Close" AnchorPane.topAnchor="21.0" />
<Button id="cmdClose" fx:id="cmdTest" layoutX="386.0" layoutY="21.0" mnemonicParsing="false" prefHeight="30.0" prefWidth="112.0" text="Test" />
</children>
</AnchorPane>
我缺少什么? 请帮帮我..
属性值工厂与bean中的任何getter和setters函数都不匹配。 因此,如果将单元格值工厂设置为下一个:
colID.setCellValueFactory(new PropertyValueFactory<studentInfo, Integer>("id"));
属性值工厂将查找函数getId(),setId()和idProperty()。 最后一个返回您在bean中拥有的属性本身。 查看PropertyValueFactory的API和Table View的教程以进一步了解这一点。
还要执行agonist_所说的,您将创建两次列。
有几件事。 每次单击按钮时,都在设置CellValueFactory。 您需要将其放在初始化中,而不是在按钮事件中。
函数getAllstudentInfo()将阻止您的GUI,因为查询被阻止了。 您应该在后台线程中执行此操作。
因此,替换您的tblViewer.getItems().setAll(getAllstudentInfo());
像这样:
Service<ObservableList<studentInfo>> service = new Service<ObservableList<studentInfo>>() {
@Override
protected Task<ObservableList<studentInfo>> createTask() {
return new Task<ObservableList<studentInfo>>() {
@Override
protected ObservableList<studentInfo> call() throws Exception {
return FXCollections.observableArrayList(getAllstudentInfo());
}
};
}
};
tblViewer.itemsProperty().bind(service.valueProperty());
service.start();
看看JavaFX 2的并发教程,肯定会对您有所帮助。
希望能帮助到你。
首先,不对FXML导入执行新实例。 只是
@FXML
private TableColumn<String> colContact;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.