当前位置: 首页 > 知识库问答 >
问题:

将POJO对象放入JTable

韩宏朗
2023-03-14

我试图用我使用Gson()提取的POJO填充JTable。使用调试器,或者使用toString()将值打印到控制台,我可以看到对象的映射是成功的。我的问题在于用对象填充自定义Jtable。

问题:我的GUI包含一个按钮,它获取一个搜索字段,并将其发送到一个API,该API返回一个JSON响应,我正确映射了JSON,但我不知道如何将数据放入表中。

我尝试过的:addFillings()和insertFillings()方法返回:FillingStableModel类型中的addFillings(Filling)方法不适用于参数(ExtractorClass)

代码

下面是包含getter和setter以及toString()方法的Filing类:

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Filing {

    @SerializedName("id")
    @Expose
    private static String id;
    @SerializedName("filing_date")
    @Expose
    private FilingDate filingDate;
    @SerializedName("accepted_date")
    @Expose
    private AcceptedDate acceptedDate;
    @SerializedName("period_end_date")
    @Expose
    private PeriodEndDate periodEndDate;
    @SerializedName("report_type")
    @Expose
    private String reportType;
    @SerializedName("sec_unique_id")
    @Expose
    private String secUniqueId;
    @SerializedName("filing_url")
    @Expose
    private String filingUrl;
    @SerializedName("report_url")
    @Expose
    private String reportUrl;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        Filing.id = id;
    }

    public FilingDate getFilingDate() {
        return filingDate;
    }

    public void setFilingDate(FilingDate filingDate) {
        this.filingDate = filingDate;
    }

    public AcceptedDate getAcceptedDate() {
        return acceptedDate;
    }

    public void setAcceptedDate(AcceptedDate acceptedDate) {
        this.acceptedDate = acceptedDate;
    }

    public PeriodEndDate getPeriodEndDate() {
        return periodEndDate;
    }

    public void setPeriodEndDate(PeriodEndDate periodEndDate) {
        this.periodEndDate = periodEndDate;
    }

    public String getReportType() {
        return reportType;
    }

    public void setReportType(String reportType) {
        this.reportType = reportType;
    }

    public String getSecUniqueId() {
        return secUniqueId;
    }

    public void setSecUniqueId(String secUniqueId) {
        this.secUniqueId = secUniqueId;
    }

    public String getFilingUrl() {
        return filingUrl;
    }

    public void setFilingUrl(String filingUrl) {
        this.filingUrl = filingUrl;
    }

    public String getReportUrl() {
        return reportUrl;
    }

    public void setReportUrl(String reportUrl) {
        this.reportUrl = reportUrl;
    }

    public String toString() {
        return "[id: " + id + ", Filing Date: " + filingDate.year + "/" + filingDate.month + "/" + filingDate.day
                + ", report_type: " + reportType + ", Report url: " + reportUrl + "]";
    }

}

下面是映射对象的提取器类:

import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class ExtractorClass {

@SerializedName("filings")
@Expose
private List<Filing> filings = null;
@SerializedName("company")
@Expose
private Company company;
@SerializedName("next_page")
@Expose
private String nextPage;

public List<Filing> getFilings() {
return filings;
}

public void setFilings(List<Filing> filings) {
this.filings = filings;
}

public Company getCompany() {
return company;
}

public void setCompany(Company company) {
this.company = company;
}

public String getNextPage() {
return nextPage;
}

public void setNextPage(String nextPage) {
this.nextPage = nextPage;
}

}

以下是主应用程序窗口中的JButton:

    JButton btnNewButton = new JButton("Search");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

                ApiClient defaultClient = Configuration.getDefaultApiClient();
                ApiKeyAuth auth = (ApiKeyAuth) defaultClient.getAuthentication("ApiKeyAuth");
                auth.setApiKey("API_KEY");

                // String identifier = "AAPL"; // String | A Company identifier (Ticker,
                // CIK, LEI, Intrinio ID)

                String reportType = null; // String | Filter by report type [see -
                // /documentation/sec_filing_report_types]. Separate values with commas to
                // return multiple report types.
                LocalDate startDate = null; // LocalDate | Filed on or after the given date
                LocalDate endDate = null; // LocalDate | Filed before or after the given date
                Integer pageSize = 50; // Integer | The number of results to return
                String nextPage = null; // String | Gets the next page of data from a previous API call

                String userInput = null;

                CompanyApi companyApi = new CompanyApi();
                userInput = textField.getText().trim().toUpperCase();
                String identifier = userInput;

                try {

                    ApiResponseCompanyFilings result = companyApi.getCompanyFilings(identifier, reportType, startDate,
                            endDate, pageSize, nextPage);

                    String convertedResult = new Gson().toJson(result);

                    ExtractorClass extractedObjects = new Gson().fromJson(convertedResult, ExtractorClass.class);
                    model.addFilings(extractedObjects);

                } catch (ApiException e) {
                    System.err.println("Exception when calling CompanyApi#getCompanyFilings");
                    e.printStackTrace();
                }
            }

        });

最后是自定义表:

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import com.g4ther.SECextractor.Date;
import com.g4ther.SECextractor.Filing;
import com.g4ther.SECextractor.FilingDate;

public class FilingsTableModel extends AbstractTableModel
{
    private String[] columnNames =
    {
        "ID",
        "Filing Date",
        "Report Type",
        "Report URL"
    };

    private List<Filing> filings;

    public FilingsTableModel()
    {
        filings = new ArrayList<Filing>();
    }

    public FilingsTableModel(List<Filing> filings)
    {
        this.filings = filings;
    }

    public int getColumnCount()
    {
        return columnNames.length;
    }

    public String getColumnName(int column)
    {
        return columnNames[column];
    }

    public int getRowCount()
    {
        return filings.size();
    }

    @Override
    public Class getColumnClass(int column)
    {
        switch (column)
        {
            case 2: return Date.class;
            default: return String.class;
        }
    }

    @Override
    public boolean isCellEditable(int row, int column)
    {
        switch (column)
        {
            case 2: return true; // only the birth date is editable
            default: return false;
        }
    }

    @Override
    public Object getValueAt(int row, int column)
    {
        Filing filing = getFiling(row);

        switch (column)
        {
            case 0: return filing.getId();
            case 1: return filing.getFilingDate();
            case 2: return filing.getReportType();
            case 3: return filing.getReportUrl();
            default: return null;
        }
    }

    @Override
    public void setValueAt(Object value, int row, int column)
    {
        Filing filing = getFiling(row);

        switch (column)
        {
            case 0: ((Filing) filing).setId((String)value); break;
            case 1: ((Filing) filing).setFilingDate((FilingDate)value); break;
            case 2: ((Filing) filing).setReportType((String)value); break;
            case 3: ((Filing) filing).setReportUrl((String)value); break;
        }

        fireTableCellUpdated(row, column);
    }

    public Filing getFiling(int row)
    {
        return filings.get( row );
    }

    public void addFilings(Filing filing)
    {
        insertFilings(getRowCount(), filing);
    }

    public void insertFilings(int row, Filing filing)
    {
        filings.add(row, filing);
        fireTableRowsInserted(row, row);
    }


}

原始API响应:

{
    "filings": [
        {
            "id": "fil_95GBZB",
            "filing_date": {
                "year": 2019,
                "month": 10,
                "day": 30
            },
            "accepted_date": {
                "dateTime": {
                    "date": {
                        "year": 2019,
                        "month": 10,
                        "day": 30
                    },
                    "time": {
                        "hour": 16,
                        "minute": 30,
                        "second": 40,
                        "nano": 0
                    }
                },
                "offset": {
                    "totalSeconds": 0
                }
            },
            "period_end_date": {
                "year": 2019,
                "month": 10,
                "day": 30
            },
            "report_type": "8-K",
            "sec_unique_id": "0000320193-19-000117",
            "filing_url": "https://www.sec.gov/Archives/edgar/data/320193/000032019319000117/0000320193-19-000117-index.htm",
            "report_url": "https://www.sec.gov/ix?doc\u003d/Archives/edgar/data/320193/000032019319000117/a8-kq420199282019.htm",
            "instance_url": "https://www.sec.gov/Archives/edgar/data/320193/000032019319000117/aapl-20191030.xsd"
        }
    ],
    "company": {
        "id": "com_NX6GzO",
        "ticker": "AAPL",
        "name": "Apple Inc",
        "lei": "HWUPKR0MPOU8FGXBT394",
        "cik": "0000320193"
    },
    "next_page": "MjAxOS0xMC0zMHw1NzkxNjc1"
}

将其映射并将提取的对象打印到控制台后:

[[id: null, Filing Date: 2019/10/30, report_type: 8-K, Report url: https://www.sec.gov/ix?doc=/Archives/edgar/data/320193/000032019319000117/a8-kq420199282019.htm]]

真的困在这里了,有人能帮我吗?

共有1个答案

芮安顺
2023-03-14

类型FillingStableModel中的方法AddFillings(Filling)不适用于参数(ExtractorClass)

首先,方法名称应该是addfilling(…) 因为参数是单个归档对象。

您的提取器类具有以下方法

public List<Filing> getFilings() 
{
    return filings;
}

它返回一个包含归档对象的List。

因此,您需要遍历List并调用addFling(...)方法,用于包含在List中的每个Fling对象。

 类似资料:
  • 我正在编写一些使用放心及其静态编程语言扩展的测试来测试一些简单的Spring MVCendpoint。我正在尝试了解如何提取值。 一个endpoint返回<code>BookDetailsView < code>BookDetailsView是一个非常简单的Kotlin数据类,只有一个字段: 对于单个对象终结点,我有: 这与预期的一样,但尝试对<code>页应用相同的技术 我尝试了各种排列,如下面

  • 问题内容: 我正在使用烧瓶和Redis。我决定尝试使用rom redis orm(http://pythonhosted.org/rom/)来管理一些较为复杂的数据结构。我有一个对象列表,可以说: 我也有rom模型: 这似乎在我的开发人员设置上起作用。我已经将大约25个“ Stored_url”对象加载到REDIS中(在cmd行中确认)。我正在尝试提出一种将所有Stored_url类型的对象放入p

  • 我正在制作这个基于控制台的游戏。 但我不明白这一点,也不明白为什么这样做是错误的。 所以基本上我有10个房间,所以一个房间有以下东西: -房间号码 -hashmap,其中包含一个Room作为值和一个String作为键 现在的问题是,一个房间可以从4个方向北、东、南、西退出,所以这是哈希图中的字符串/键。 它也可以有2个出口或1或3个。 所以在那个哈希图中,我将方向保存为键和值另一个房间对象,这样我

  • 因此,我希望使用将一些记录懒洋洋地取入POJOs,如下所示: 我当然可以做以下事情,但感觉不对: 谢了!

  • 问题内容: 如何转换 这是例子 有没有简单的方法可以做到这一点?什么库在这里有用? 谢谢。 问题答案: 也许http://dozer.sourceforge.net可以为您提供帮助。它是可通过xml配置的映射库。 我很快尝试了这个: 我的mappings.xml看起来像这样: 不幸的是,它仅将10映射到所有三个PojoObject属性。也许您可以看到错误并使用代码段。也许这是Dozer中的一个错误

  • 问题内容: 我正在尝试使用GSON将JSON对象转换为POJO。 JSON字串 与GSON一起使用的AutomationProjectsList类 自动化项目POJO 我正在使用的代码 JSONArray jsonArray =新的JSONArray(response.getEntity(String.class)); 但是它给出了一个例外: 为什么会收到IndexOutOfBoundsExcep