【问题标题】:How to get data from Mariadb database to table via JavaFX?如何通过 JavaFX 从 Mariadb 数据库中获取数据到表中?
【发布时间】:2019-09-14 23:33:18
【问题描述】:

开始学习Java语言。我真的很喜欢 Scene Builder 技术。我试图在 GUI 中显示 MariaDB 数据库中的表,但出现无法解决的错误。请帮忙,如果你明白。我完全放弃了代码。

Main.java

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application  {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("view/FXMLSample.fxml"));
        Scene scene = new Scene(root, 640,480);

        primaryStage.setScene(scene);
        primaryStage.setTitle("User list");
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

控制器/Controller.java

package sample.controller;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TableView;
import sample.model.Person;
import sample.model.ConnectDB;

import javafx.scene.control.TableColumn;

import java.sql.*;

public class Controller implements Initializable {

    Connection conn = null;
    ResultSet rs = null;
    PreparedStatement pst = null;

    private ObservableList<Person> usersData = FXCollections.observableArrayList();

    @FXML
    private TableView<Person> tableUsers;

    @FXML
    private TableColumn<Person, Integer> idColumn;

    @FXML
    private TableColumn<Person, String> usernameColumn;

    @FXML
    private TableColumn<Person, String> firstnameColumn;

    @FXML
    private TableColumn<Person, String> lastnameColumn;

    @FXML
    private TableColumn<Person, String> emailColumn;

    @FXML
    private TableColumn<Person, String> genderColumn;

    @FXML
    private TableColumn<Person, String> descColumn;

    @FXML
    private TableColumn<Person, String> createdonColumn;

    @FXML
    private TableColumn<Person, String> editedonColumn;

    @FXML
    private TableColumn<Person, String> activeColumn;

    @FXML
    public void initialize(URL location, ResourceBundle resources) {

        conn = ConnectDB.ConnectMariaDB();
        initData();

        tableUsers.setItems(usersData);

    }

    private void initData(ActionEvent event) throws SQLException {

        String sql = "SELECT * FROM test";
        rs = pst.executeQuery(sql);

        if(rs.next()) {
            int id = rs.getInt("id");
            String username = rs.getString("username");
            String firstname = rs.getString("firstname");
            String lastname = rs.getString("lastname");
            String email = rs.getString("email");
            String gender = rs.getString("gender");
            String description = rs.getString("description");
            String createdon = rs.getString("createdon");
            String editedon = rs.getString("editedon");
            String active = rs.getString("active");
            usersData.add(new Person(id, username, firstname, lastname, email, gender, description, createdon, editedon, active));
        }


    }


}

model/ConnectDB.java

package sample.model;

import java.sql.*;

public class ConnectDB {

    Connection conn = null;

    public static Connection ConnectMariaDB() {
        try {
            Class.forName("org.mariadb.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mariadb://localhost/test_new","root","123456");
            System.out.println("Connection success!");
            return conn;
        } catch(Exception e){
            System.out.println(e);
            return null;
        }
    }
}

model/Person.java

package sample.model;

import javafx.beans.property.SimpleStringProperty;

public class Person {

    private int id;
    private String username;
    private String firstname;
    private String lastname;
    private String email;
    private String gender;
    private String description;
    private String createdon;
    private String editedon;
    private String active;

    public Person(int id, String username, String firstname, String lastname, String email, String gender, String description, String createdon, String editedon, String active) {
        this.id = id;
        this.username = username;
        this.firstname = firstname;
        this.lastname = lastname;
        this.email = email;
        this.gender = gender;
        this.description = description;
        this.createdon = createdon;
        this.editedon = editedon;
        this.active = active;
    }

    public Person() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getCreatedon() {
        return createdon;
    }

    public void setCreatedon(String createdon) {
        this.createdon = createdon;
    }

    public String getEditedon() {
        return editedon;
    }

    public void setEditedon(String editedon) {
        this.editedon = editedon;
    }

    public String getActive() {
        return active;
    }

    public void setActive(String active) {
        this.active = active;
    }
}

查看/FXMLSample.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>

<VBox prefHeight="400.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.controller.Controller">
  <children>
    <MenuBar VBox.vgrow="NEVER">
      <menus>
        <Menu mnemonicParsing="false" text="File">
          <items>
            <MenuItem mnemonicParsing="false" text="New" />
            <MenuItem mnemonicParsing="false" text="Open…" />
            <Menu mnemonicParsing="false" text="Open Recent" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Close" />
            <MenuItem mnemonicParsing="false" text="Save" />
            <MenuItem mnemonicParsing="false" text="Save As…" />
            <MenuItem mnemonicParsing="false" text="Revert" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Preferences…" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Quit" />
          </items>
        </Menu>
        <Menu mnemonicParsing="false" text="Edit">
          <items>
            <MenuItem mnemonicParsing="false" text="Undo" />
            <MenuItem mnemonicParsing="false" text="Redo" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Cut" />
            <MenuItem mnemonicParsing="false" text="Copy" />
            <MenuItem mnemonicParsing="false" text="Paste" />
            <MenuItem mnemonicParsing="false" text="Delete" />
            <SeparatorMenuItem mnemonicParsing="false" />
            <MenuItem mnemonicParsing="false" text="Select All" />
            <MenuItem mnemonicParsing="false" text="Unselect All" />
          </items>
        </Menu>
        <Menu mnemonicParsing="false" text="Help">
          <items>
            <MenuItem mnemonicParsing="false" text="About MyHelloApp" />
          </items>
        </Menu>
      </menus>
    </MenuBar>
    <AnchorPane id="AnchorPane" maxHeight="-1.0" maxWidth="-1.0" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">
         <children>
            <Label layoutX="20.0" layoutY="14.0" text="Table" />
            <TableView fx:id="tableUsers" layoutX="20.0" layoutY="37.0" prefHeight="285.0" prefWidth="600.0">
              <columns>
                  <TableColumn prefWidth="42.0" text="ID" fx:id="idColumn" />
                  <TableColumn prefWidth="67.0" text="Username" fx:id="usernameColumn" />
                  <TableColumn prefWidth="156.0" text="Fullname">
                     <columns>
                        <TableColumn prefWidth="75.0" text="First name" fx:id="firstnameColumn" />
                        <TableColumn prefWidth="75.0" text="Last name" fx:id="lastnameColumn" />
                     </columns>
                  </TableColumn>
                <TableColumn prefWidth="75.0" text="E-mail" fx:id="emailColumn" />
                <TableColumn prefWidth="69.0" text="Gender" fx:id="genderColumn" />
                  <TableColumn prefWidth="69.0" text="Description" fx:id="descColumn" />
                  <TableColumn prefWidth="63.0" text="Created" fx:id="createdonColumn" />
                  <TableColumn minWidth="0.0" prefWidth="57.0" text="Edited" fx:id="editedonColumn" />
                  <TableColumn minWidth="4.0" prefWidth="105.0" text="Active" fx:id="activeColumn" />
              </columns>
            </TableView>
            <Button layoutX="23.0" layoutY="336.0" mnemonicParsing="false" text="Create" />
            <Button layoutX="88.0" layoutY="336.0" mnemonicParsing="false" text="Update" />
            <Button layoutX="154.0" layoutY="336.0" mnemonicParsing="false" text="Delete" />
            <Button layoutX="219.0" layoutY="336.0" mnemonicParsing="false" text="Refresh" />
         </children>
    </AnchorPane>
  </children>
</VBox>

错误:

错误:(64, 9) java: 类 sample.controller.Controller 中的方法 initData 不能应用于给定类型; 必需:javafx.event.ActionEvent 发现:没有参数 原因:实际参数列表和形式参数列表的长度不同

现在是这样的

private void initData() throws SQLException {
...
}

还有

@FXML
    public void initialize(URL location, ResourceBundle resources) {

        conn = ConnectDB.ConnectMariaDB();
        try {
            initData();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        tableUsers.setItems(usersData);

    }

最后还是报错了。

"C:\Program Files\Java\jdk1.8.0_211\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 社区版 2019.1\lib\idea_rt.jar=50017:C:\Program Files\JetBrains\IntelliJ IDEA 社区版 2019.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_211\jre\lib\charsets.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\deploy.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\ext\access-bridge-64.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\ext\cldrdata.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\ext\dnsns.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\ext\jaccess.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\ext\jfxrt.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\ext\localedata.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\ext\nashorn.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\ext\sunec.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\ext\sunjce_provider.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\ext\sunmscapi.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\ext\sunpkcs11.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\ext\zipfs.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\javaws.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\jce.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\jfr.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\jfxswt.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\jsse.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\management-agent.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\plugin.jar;C:\Program 文件\Java\jdk1.8.0_211\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\rt.jar;C:\Projects\JavaFXTest\out\production\JavaFXTest;C:\Users\ccpraktikant\Downloads\mariadb-java-client-2.4.1.jar " sample.Main 连接成功!应用程序启动方法中的异常 java.lang.reflect.InvocationTargetException 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389) 在 com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767) 原因:java.lang.RuntimeException:应用程序启动中的异常 方法在 com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917) 在 com.sun.javafx.application.LauncherImpl.lambda$launchApplication$159(LauncherImpl.java:182) 在 java.lang.Thread.run(Thread.java:748) 引起: javafx.fxml.LoadException: /C:/Projects/JavaFXTest/out/production/JavaFXTest/sample/view/FXMLSample.fxml

在 javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104) 在 javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097) 在 sample.Main.start(Main.java:13) 在 com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$166(LauncherImpl.java:863) 在 com.sun.javafx.application.PlatformImpl.lambda$runAndWait$179(PlatformImpl.java:326) 在 com.sun.javafx.application.PlatformImpl.lambda$null$177(PlatformImpl.java:295) 在 java.security.AccessController.doPrivileged(Native Method) 在 com.sun.javafx.application.PlatformImpl.lambda$runLater$178(PlatformImpl.java:294) 在 com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 在 com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 在 com.sun.glass.ui.win.WinApplication.lambda$null$152(WinApplication.java:177) ... 1 更多原因:java.lang.NullPointerException at sample.controller.Controller.initData(Controller.java:77) 在 sample.controller.Controller.initialize(Controller.java:65) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548) ... 17 更多 异常运行应用程序示例.Main

进程以退出代码 1 结束

【问题讨论】:

    标签: java javafx fxml


    【解决方案1】:

    如果你看

    initData();

    还有你的方法,

    private void initData(ActionEvent event) throws SQLException {
    

    该方法带有参数,而您的调用没有任何参数。

    我建议你重写你的方法不带参数。

    private void initData() throws SQLException {
    

    【讨论】:

    • 信息:java:编译模块“JavaFXTest”时发生错误信息:javac 1.8.0_211 用于编译 java 源信息:26.04.2019 08:29 - 构建完成,出现 1 个错误和 0 个警告3 秒 609 毫秒 C:\Projects\JavaFXTest\src\sample\controller\Controller.java 错误:(64, 17) java: 未报告的异常 java.sql.SQLException;必须被抓住或宣布被抛出
    • 如果去掉参数出来这样的错误。
    • 现在喜欢这个private void initData() throws SQLException {@FXML public void initialize(URL location, ResourceBundle resources) { conn = ConnectDB.ConnectMariaDB(); try { initData(); } catch (SQLException e) { e.printStackTrace(); } tableUsers.setItems(usersData); }
    • 很好地解决了您的新问题。如果我的回答对您最初的问题有所帮助,那么您应该将其排除为正确的解决方案。如果您在使用此答案更新代码后遇到了新问题,那么您应该问了一个新问题。 StackOverflow 试图避免不断变化的/动态的问题。
    【解决方案2】:

    我重写了控制器如下,一切正常。

    控制器/Controller.java

    package sample.controller;
    
    import java.net.URL;
    import java.util.ResourceBundle;
    
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.PropertyValueFactory;
    import sample.model.Person;
    import sample.model.ConnectDB;
    
    import javafx.scene.control.TableColumn;
    
    import java.sql.*;
    
    public class Controller implements Initializable {
    
        Connection conn = null;
        ResultSet rs = null;
        Statement st = null;
    
        @FXML
        private URL location;
    
        @FXML
        private ResourceBundle resources;
    
        @FXML
        private TableView<Person> tableUsers;
    
        @FXML
        private TableColumn<Person, Integer> idColumn;
    
        @FXML
        private TableColumn<Person, String> usernameColumn;
    
        @FXML
        private TableColumn<Person, String> firstnameColumn;
    
        @FXML
        private TableColumn<Person, String> lastnameColumn;
    
        @FXML
        private TableColumn<Person, String> emailColumn;
    
        @FXML
        private TableColumn<Person, String> genderColumn;
    
        @FXML
        private TableColumn<Person, String> descColumn;
    
        @FXML
        private TableColumn<Person, String> createdonColumn;
    
        @FXML
        private TableColumn<Person, String> editedonColumn;
    
        @FXML
        private TableColumn<Person, String> activeColumn;
    
        @FXML
        public void initialize(URL location, ResourceBundle resources) {
    
            conn = ConnectDB.ConnectMariaDB();
    
            final ObservableList data = FXCollections.observableArrayList();
    
            String query = "SELECT * FROM test";
    
            Statement st = null;
            try {
                st = conn.createStatement();
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
            ResultSet rs = null;
            try {
                rs = st.executeQuery(query);
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
            Person person;
    
            try {
                while (rs.next()) {
                    int id = rs.getInt("id");
                    String username = rs.getString("username");
                    String firstname = rs.getString("firstname");
                    String lastname = rs.getString("lastname");
                    String email = rs.getString("email");
                    String gender = rs.getString("gender");
                    String description = rs.getString("description");
                    String createdon = rs.getString("createdon");
                    String editedon = rs.getString("editedon");
                    String active = rs.getString("active");
    
                    person = new Person(id,username,firstname,lastname,email,gender,description,createdon,editedon,active);
                    data.add(person);
                }
                st.close();
            } catch(Exception  e) {
                System.out.println("There is an Exception.");
                System.out.println(e.getMessage());
            }
            idColumn.setCellValueFactory(new PropertyValueFactory<>("id"));
            usernameColumn.setCellValueFactory(new PropertyValueFactory<>("username"));
            firstnameColumn.setCellValueFactory(new PropertyValueFactory<>("firstname"));
            lastnameColumn.setCellValueFactory(new PropertyValueFactory<>("lastname"));
            emailColumn.setCellValueFactory(new PropertyValueFactory<>("email"));
            genderColumn.setCellValueFactory(new PropertyValueFactory<>("gender"));
            descColumn.setCellValueFactory(new PropertyValueFactory<>("description"));
            createdonColumn.setCellValueFactory(new PropertyValueFactory<>("createdon"));
            editedonColumn.setCellValueFactory(new PropertyValueFactory<>("editedon"));
            activeColumn.setCellValueFactory(new PropertyValueFactory<>("active"));
    
            tableUsers.setItems(data);
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      相关资源
      最近更新 更多