填充要从两个不同类中获取数据的TableView

时间:2019-02-07 16:09:01

标签: java javafx

我目前有两个类,一个是AddressDetails,另一个是Results。 我想发生的是该表填充了两者的值,但是当前它仅填充了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从读取和excel文件获取其值,而Results从API调用获取其值,所以我猜测我需要将AddressDetails和Results放入另一个类这样我就可以将TableView称为TableView之类的东西。但是我不确定该怎么做。由于我是JavaFX和Java的新手,所以将不胜感激,所以对它的了解并不多,尤其是对于TableViews。

1 个答案:

答案 0 :(得分:0)

因此,我想出了一种方法,可以重新使用相同的数据类从SQL中获取数据。不幸的是,我无法获得对ApacheDBUtils使用SimpleStringProperty或SimpleIntegerProperty(0000000000000000000000000000000000000000000000000001000100100001000000000000000000000000 0000000000000000000000000000000000000000000000000001000100100001000000000000000000000000 0000000000000000000000000000000000000000000000000001000100100001000000000000000000000000 0000000000000000000000000000000000000000000000000001000100100001000000000000000000000000 0000000000000000000000000000000000000000000000000001000100100001000000000000000000000000 0000000000000000000000000000000000000000000000000011010100100001010000000000000000000000 所必需的)的反思。但是,使用TableView可以手动填充字段。基本上,使MapListHandler的模型类也成为您的数据类。

Address.java

TableView

SQLManager.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);
    }

}

Main.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;
    }
}