A
A
Andrej Kopp2019-04-25 17:00:42
Java
Andrej Kopp, 2019-04-25 17:00:42

How to dump database from MariaDB to FXML table from Scene Builder JavaFX?

Hello. Started learning Java. I really liked the Scene Builder technology. I'm trying to display a table from a MariaDB database in the GUI, but I'm getting an error that cannot be resolved. I would be very grateful for any help.
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/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;
            }
        }
    }

view/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>

error:

Error:(64, 9) java: method initData in class sample.controller.Controller cannot be applied to given types;
required: javafx.event.ActionEvent
found: no arguments
reason: actual and formal argument lists differ in length

Answer the question

In order to leave comments, you need to log in

2 answer(s)
A
Andrej Kopp, 2019-04-26
@sequelone

I rewrote the controller as follows and everything worked.

package sample.controller;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
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
    private void tableUsersCreate(ActionEvent event) {
        Alert alert = new Alert(AlertType.CONFIRMATION);
        alert.setTitle("Table refresh");

        // alert.setHeaderText("Results:");
        alert.setContentText("Refresh table to the database successfully!");
        tableUsers.refresh();
        alert.showAndWait();
    }

    @FXML
    private void tableUsersUpdate(ActionEvent event) {
        Alert alert = new Alert(AlertType.WARNING);
        alert.setTitle("Table refresh");

        // alert.setHeaderText("Results:");
        alert.setContentText("Refresh table to the database successfully!");
        tableUsers.refresh();
        alert.showAndWait();
    }

    @FXML
    private void tableUsersRefresh(ActionEvent event) {
        Alert alert = new Alert(AlertType.INFORMATION);
        alert.setTitle("Table refresh");

        // alert.setHeaderText("Results:");
        alert.setContentText("Refresh table to the database successfully!");
        tableUsers.refresh();
        alert.showAndWait();
    }

    @FXML
    private void tableUsersDelete(ActionEvent event) {
        Alert alert = new Alert(AlertType.ERROR);
        alert.setTitle("Table refresh");

        // alert.setHeaderText("Results:");
        alert.setContentText("Refresh table to the database successfully!");
        tableUsers.refresh();
        alert.showAndWait();
    }

    @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");
                boolean active = rs.getBoolean("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);

    }

}

A
Alexey Cheremisin, 2019-04-25
@leahch

AAA! At you business even did not reach compilation?
method

public void initialize(URL location, ResourceBundle resources)
, in it you call initData();without input arguments, which you have defined as
private void initData(ActionEvent event) throws SQLException {
. You either pass an argument in the call, or correct the method itself and remove the parameter ActionEvent event
. And finally. you shouldn't send so much code, just an error and a piece of code and a description of when and under what circumstances it occurs. With very, very rare exceptions, someone will be willing to download the entire project and compile it.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question