java - 即使打印数据,Javafx SQLite Tableview也不会填充
问题描述
使用 Apache Netbeans IDE 11.3.Currently 无法填充 tableview,即使我可以打印数据。
我正在构建一个 Operator GUI 的东西。目前正在尝试使用 Operator 数据填充 tableview,但无法做到。
控制器类:
public class OperatorenController implements Initializable {
DatabaseController db = new DatabaseController();
private ObservableList<Operatoren> OperatorenList;
@FXML
private TableView<Operatoren> Operatorentable = new TableView<>();
@FXML
private TableColumn<Operatoren, Integer> id = new TableColumn<>();
@FXML
private TableColumn<Operatoren, String> name = new TableColumn<>();
@FXML
private TableColumn<Operatoren, String> nachname = new TableColumn<>();
@FXML
private TableColumn<Operatoren, String> firmname = new TableColumn<>();
@FXML
private void handleDisplayTables(ActionEvent event) throws NullPointerException {
try {Connection conn = db.ConnectDB();
String dbliste = "SELECT * FROM [operatoren]";
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(dbliste);
OperatorenList = FXCollections.observableArrayList();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String nachname = rs.getString("nachname");
String firmname = rs.getString("firmname");
OperatorenList.add(new Operatoren(id, name, nachname,firmname));
System.out.println(id + " " + name+" " + nachname+" " + firmname+" ");
}
} catch (Exception e) {
System.out.println(e);
}
id.setCellValueFactory(new PropertyValueFactory<>("id"));
name.setCellValueFactory(new PropertyValueFactory<>("name"));
nachname.setCellValueFactory(new PropertyValueFactory<>("nachname"));
firmname.setCellValueFactory(new PropertyValueFactory<>("firmname"));
name.setCellValueFactory(cellData -> { return (new SimpleStringProperty(((Operatoren)cellData.getValue()).getName()));});
nachname.setCellValueFactory(cellData -> { return (new SimpleStringProperty(((Operatoren)cellData.getValue()).getNachname()));});
firmname.setCellValueFactory(cellData -> { return (new SimpleStringProperty(((Operatoren)cellData.getValue()).getFirmname()));});
id.setCellValueFactory(cellData -> { return (new SimpleIntegerProperty(((Operatoren)cellData.getValue()).getId())).asObject();});
Operatorentable.setItems(OperatorenList);
Operatorentable.getColumns().addAll(id,name,nachname,firmname);
Operatorentable.refresh();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
我可以从数据库打印数据,所以我不认为数据库是这里的问题。
运算符 java 类
public class Operatoren {
public SimpleStringProperty name,nachname,firmname;
public SimpleIntegerProperty id;
public Operatoren(int id,String name,String nachname,String firmname){
this.id = new SimpleIntegerProperty(id);
this.name = new SimpleStringProperty(name);
this.nachname = new SimpleStringProperty(nachname);
this.firmname = new SimpleStringProperty(firmname);
}
public static void main(String[] args) {
}
public String getName() {
return name.get();
}
public SimpleStringProperty getNameProperty() {
return name;
}
public String getNachname() {
return nachname.get();
}
public SimpleStringProperty getNachnameProperty() {
return nachname;
}
public String getFirmname() {
return firmname.get();
}
public SimpleStringProperty getFirmnameProperty() {
return firmname;
}
public int getId() {
return id.get();
}
public SimpleIntegerProperty getIdProperty() {
return id;
}
}
<AnchorPane id="AnchorPane" prefHeight="600.0" prefWidth="800.0" style="-fx-background-color: #313455;" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="inf202.OperatorenController">
<children>
<Button layoutX="140.0" layoutY="235.0" mnemonicParsing="false" onAction="#personEkle" prefHeight="25.0" prefWidth="109.0" style="-fx-background-color: #f5f5f5;" text="Person ekle" />
<Button layoutX="136.0" layoutY="354.0" mnemonicParsing="false" onAction="#personSil" prefHeight="25.0" prefWidth="109.0" style="-fx-background-color: #f5f5f5;" text="person sil" />
<Button layoutX="136.0" layoutY="443.0" mnemonicParsing="false" onAction="#personList" prefHeight="25.0" prefWidth="109.0" style="-fx-background-color: #f5f5f5;" text="person listele" />
<Button layoutX="136.0" layoutY="400.0" mnemonicParsing="false" onAction="#handleDisplayTables" prefHeight="25.0" prefWidth="109.0" style="-fx-background-color: #f5f5f5;" text="Person duzenle" />
<Text fill="#948f8f" layoutX="122.0" layoutY="87.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Go Back">
<font>
<Font name="System Bold" size="18.0" />
</font>
</Text>
<Line endX="84.0" endY="11.0" layoutX="25.0" layoutY="57.0" startX="68.0" startY="23.0" stroke="#948f8f" strokeWidth="2.0" />
<Line endX="-85.0" endY="12.0" fill="#868686" layoutX="195.0" layoutY="81.0" startX="-103.4141845703125" startY="0.414215087890625" stroke="#948f8f" strokeWidth="2.0" />
<Button layoutX="86.0" layoutY="68.0" mnemonicParsing="false" onAction="#Operatoren" opacity="0.0" prefHeight="25.0" prefWidth="109.0" text="Button" />
<TextField layoutX="121.0" layoutY="126.0" />
<TextField layoutX="121.0" layoutY="165.0" />
<TextField layoutX="121.0" layoutY="200.0" />
<Text fill="#948f8f" layoutX="61.0" layoutY="145.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Name">
<font>
<Font name="System Bold" size="18.0" />
</font>
</Text>
<Text fill="#948f8f" layoutX="20.0" layoutY="184.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Nachname">
<font>
<Font name="System Bold" size="18.0" />
</font>
</Text>
<Text fill="#948f8f" layoutX="21.0" layoutY="220.0" strokeType="OUTSIDE" strokeWidth="0.0" text="FirmName">
<font>
<Font name="System Bold" size="18.0" />
</font>
</Text>
<TextField layoutX="121.0" layoutY="316.0" />
<Text fill="#948f8f" layoutX="77.0" layoutY="335.0" strokeType="OUTSIDE" strokeWidth="0.0" text="ID">
<font>
<Font name="System Bold" size="18.0" />
</font>
</Text>
<Line endX="22.0" endY="249.0" layoutX="350.0" layoutY="49.0" startX="-323.0" startY="249.0" />
<Line endX="-100.5" endY="231.5" layoutX="473.0" layoutY="67.0" startX="-100.5" startY="-50.0" />
<Line endX="-102.25" endY="-188.79290771484375" layoutX="475.0" layoutY="488.0" startX="-102.25" startY="99.0" />
<TextArea layoutX="28.0" layoutY="507.0" prefHeight="69.0" prefWidth="325.0" />
<Text fill="#948f8f" layoutX="152.0" layoutY="494.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Ergebnis" wrappingWidth="77.1845703125">
<font>
<Font name="System Bold" size="18.0" />
</font>
</Text>
<TableView layoutX="389.0" layoutY="35.0" prefHeight="543.0" prefWidth="379.0">
<columns>
<TableColumn prefWidth="75.0" text="ID" />
<TableColumn prefWidth="75.0" text="Name" />
<TableColumn prefWidth="75.0" text="Nachname" />
<TableColumn prefWidth="75.0" text="Firmname" />
</columns>
</TableView>
</children>
</AnchorPane>
解决方案
永远不要初始化带注释的字段@FXML
。
如果您删除控制器中的初始化,则会出现空指针异常的原因是您忘记将fx:id
s 放在 FXML 文件中的元素上。
您要向其传递数据的TableView
对象是控制器中定义的对象,而不是 FXML 文件中定义的对象(并显示在场景中)。同样,TableColumn
您在其上设置单元格值工厂的 s 是您在控制器中创建的,而不是您在 FXML 文件中定义的。因此,FXML 文件中定义的表格列没有单元格值工厂,因此无法显示任何数据。
所以更换
@FXML
private TableView<Operatoren> Operatorentable = new TableView<>();
@FXML
private TableColumn<Operatoren, Integer> id = new TableColumn<>();
@FXML
private TableColumn<Operatoren, String> name = new TableColumn<>();
@FXML
private TableColumn<Operatoren, String> nachname = new TableColumn<>();
@FXML
private TableColumn<Operatoren, String> firmname = new TableColumn<>();
和
@FXML
private TableView<Operatoren> Operatorentable ;
@FXML
private TableColumn<Operatoren, Integer> id ;
@FXML
private TableColumn<Operatoren, String> name ;
@FXML
private TableColumn<Operatoren, String> nachname ;
@FXML
private TableColumn<Operatoren, String> firmname ;
并在 FXML 文件中添加fx:id
属性:
<TableView fx:id="Operatorentable" layoutX="389.0" layoutY="35.0" prefHeight="543.0" prefWidth="379.0">
<columns>
<TableColumn fx:id="id" prefWidth="75.0" text="ID" />
<TableColumn fx:id="name" prefWidth="75.0" text="Name" />
<TableColumn fx:id="nachname" prefWidth="75.0" text="Nachname" />
<TableColumn fx:id="firmname" prefWidth="75.0" text="Firmname" />
</columns>
</TableView>
请注意,模型类中的方法命名是非标准的:对于属性prop
,get 方法应该是getProp()
,set 方法应该是setProp()
,属性访问器方法应该是propProperty()
,而不是getPropProperty()
。PropertyValueFactory
如果您使用该类(我实际上并不推荐),这可能会使事情无法正常工作。
public class Operatoren {
public SimpleStringProperty name,nachname,firmname;
public SimpleIntegerProperty id;
public Operatoren(int id,String name,String nachname,String firmname){
this.id = new SimpleIntegerProperty(id);
this.name = new SimpleStringProperty(name);
this.nachname = new SimpleStringProperty(nachname);
this.firmname = new SimpleStringProperty(firmname);
}
public static void main(String[] args) {
}
public String getName() {
return name.get();
}
public SimpleStringProperty nameProperty() {
return name;
}
public String getNachname() {
return nachname.get();
}
public SimpleStringProperty nachnameProperty() {
return nachname;
}
public String getFirmname() {
return firmname.get();
}
public SimpleStringProperty firmnameProperty() {
return firmname;
}
public int getId() {
return id.get();
}
public SimpleIntegerProperty idProperty() {
return id;
}
}
设置单元格值工厂并立即用本质上等效的工厂替换它们也没有意义,您应该在初始化时执行此操作,而不是在事件处理程序中。最后,由于您在模型类中定义了 JavaFX 属性,因此无需为单元工厂创建新属性,只需引用现有属性即可:
@FXML
private void handleDisplayTables(ActionEvent event) throws NullPointerException {
try {Connection conn = db.ConnectDB();
String dbliste = "SELECT * FROM [operatoren]";
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(dbliste);
OperatorenList = FXCollections.observableArrayList();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String nachname = rs.getString("nachname");
String firmname = rs.getString("firmname");
OperatorenList.add(new Operatoren(id, name, nachname,firmname));
System.out.println(id + " " + name+" " + nachname+" " + firmname+" ");
}
} catch (Exception e) {
System.out.println(e);
}
Operatorentable.setItems(OperatorenList);
}
@Override
public void initialize(URL url, ResourceBundle rb) {
name.setCellValueFactory(cellData -> cellData.getValue().nameProperty());
nachname.setCellValueFactory(cellData -> cellData.getValue().nachnameProperty());
firmname.setCellValueFactory(cellData -> cellData.getValue().firmnameProperty());
id.setCellValueFactory(cellData -> cellData.getValue().idProperty().asObject());
}
推荐阅读
- sql - 使用带有 AND 语句的 IF 语句来计算列数 > 目标
- c# - 从 .NET Core 控制器返回生成的 HTML
- xamarin - 此 Xamarin Forms ContentPage 中的此空白行来自哪里?
- javascript - 如何在 React 中获取 Drupal 数据库中的用户节点?
- excel - DataValidation List 比较是否相同?
- javascript - Shopify“添加到购物车”无法正常工作
- xamarin - 访问集合 List Xamarin xaml 中的集合
- google-bigquery - 如何在 Google BigQuery 中安排查询以将新数据附加到表中?
- sql - 如何转置
- python - 为 Bokeh 消费准备数据框