Заполните TableView, который получает данные из двух разных классов - PullRequest
0 голосов
/ 07 февраля 2019

В настоящее время у меня есть два класса, один - AddressDetails, а другой - Результаты.Я хотел бы, чтобы таблица заполнялась значениями из обоих, однако в настоящее время она заполняется только из AddressDetails.

Мой код TableView:

table = new TableView<AddressDetails>(); 

    TableColumn<AddressDetails, String> address = new TableColumn<>("Full Address");
    TableColumn<AddressDetails, String> buildingName = new TableColumn<>("Building Name");
    TableColumn<AddressDetails, Double> buildingNum = new TableColumn<>("Building Number");
    TableColumn<AddressDetails, String> streetNam = new TableColumn<>("Street Name");
    TableColumn<AddressDetails, String> cityName = new TableColumn<>("City");
    TableColumn<AddressDetails, String> postcode = new TableColumn<>("Postcode");
    TableColumn<AddressDetails, String> countryName = new TableColumn<>("Country");
    TableColumn<Results, String> connect = new TableColumn<>("Connectivity Result");

    buildingName.setCellValueFactory(new PropertyValueFactory<>("buildName"));
    buildingNum.setCellValueFactory(new PropertyValueFactory<>("buildNum"));
    streetNam.setCellValueFactory(new PropertyValueFactory<>("streetName"));
    cityName.setCellValueFactory(new PropertyValueFactory<>("city"));
    postcode.setCellValueFactory(new PropertyValueFactory<>("postCode"));
    countryName.setCellValueFactory(new PropertyValueFactory<>("country"));
    connect.setCellValueFactory(new PropertyValueFactory<>("connect"));

    // Add columns of the address details to full address column 
    address.getColumns().addAll(buildingName, buildingNum, streetNam, cityName, postcode, countryName);
    table.getColumns().addAll(address, connect);

Класс результатов:

public class Results {

private String connect;

public Results() {

}
*Constructor, getters and setters

Класс AddressDetails:

public class AddressDetails {

private String buildName;
private double buildNum;
private String streetName;
private String city;
private String postCode;
private String country;
//private Results result;

public AddressDetails() {

}
*Constructor, getters and setters

Я бы создал класскоторый содержит весь объект, но в настоящее время AddressDetails получает свои значения из файла read и excel, а Results получает свои значения из вызова API, и поэтому я предполагаю, что мне нужно поместить AddressDetails и Results в другой класс, чтобы я мог что-то вызвать свой TableViewкак TableView.Однако я не уверен, как это сделать.Любая помощь будет принята с благодарностью, так как я новичок в JavaFX и Java, поэтому не имею большого понимания, особенно с TableViews.

1 Ответ

0 голосов
/ 07 февраля 2019

Итак, я нашел способ повторно использовать один и тот же класс данных для получения данных из SQL.К сожалению, я не смог заставить рефлекс работать, чтобы ApacheDBUtils использовал SimpleStringProperty или SimpleIntegerProperty (как требуется для TableView).Однако, используя MapListHandler, вы можете заполнить поля вручную.В основном, класс модели для TableView также будет вашим классом данных.

Address.java

package fx;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class Address
{

    private final StringProperty city;
    private final StringProperty country;

    public Address()
    {
        this.city = new SimpleStringProperty();
        this.country = new SimpleStringProperty();
    }

    public static List<Address> getAddressesFromMap(List<Map<String, Object>> addressResults)
    {
        List<Address> addresses = new ArrayList<>();
        for (Map<String, Object> addressResult : addressResults)
        {
            Address address = new Address();
            address.setCity((String) addressResult.get("city"));
            address.setCountry((String) addressResult.get("country"));
            addresses.add(address);

        }
        return addresses;
    }

    /**
     * @return the city
     */
    public StringProperty getCity()
    {
        return city;
    }

    /**
     * @return the country
     */
    public StringProperty getCountry()
    {
        return country;
    }

    /**
     * @param city the city to set
     */
    public void setCity(String city)
    {
        this.city.set(city);
    }

    /**
     * @param country the country to set
     */
    public void setCountry(String country)
    {
        this.country.set(country);
    }

}

SQLManager.java

package fx;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapListHandler;

public class SQLManager
{

    public List<Address> getAddresses()
    {

        Connection connection = createConnection();
        List<Address> addresses = new ArrayList<>();
        List<Map<String, Object>> addressResults = new ArrayList<>();

        if (connection == null)
        {
            return addresses;
        }

        try
        {
            addressResults = new QueryRunner().query(connection, "SELECT * From address;", new MapListHandler());

        } catch (SQLException ex)
        {
            Logger.getLogger(SQLManager.class.getName()).log(Level.SEVERE, null, ex);

        } finally
        {

            try
            {
                DbUtils.close(connection);

            } catch (SQLException ex)
            {
                Logger.getLogger(SQLManager.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
        addresses.addAll(Address.getAddressesFromMap(addressResults));

        return addresses;
    }


    private Connection createConnection()
    {
        Connection connection = null;
        try
        {

            connection = DriverManager.getConnection("db.connection", "db.user", "db.pass");

        } catch (SQLException ex)
        {
            Logger.getLogger(SQLManager.class.getName()).log(Level.SEVERE, null, ex);

        }
        return connection;
    }
}

Main.java

package fx;

import javafx.scene.control.TableView;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application
{

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

    @Override
    public void start(Stage primaryStage)
    {
        primaryStage.setTitle("Hello World!");

        TableView table = new TableView<Address>();
        table.setItems(FXCollections.observableArrayList(new SQLManager().getAddresses()));

        TableColumn<Address, String> cityCol = new TableColumn<>("City");
        cityCol.setCellValueFactory(features -> features.getValue().getCity());

        TableColumn<Address, String> countryCol = new TableColumn<>("Country");
        countryCol.setCellValueFactory(features -> features.getValue().getCountry());

        table.getColumns().addAll(cityCol, countryCol);
        StackPane root = new StackPane();
        root.getChildren().add(table);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...