如何重命名JList中的Object []列表

问题描述 投票:0回答:2

这里是初学者。

我正在使用一个应用程序,以向用户显示有关不同公司的信息。我通过API获得了不同格式的信息,其中一些具有使反序列化更容易的字段,而其他响应仅包含“列列表”和“行的List>”。我重新创建了一个最小的JFrame来显示我的问题:

enter image description here

我的问题是关于后者。我遍历该列表并将每一行添加到JList,一旦选中,该列表中包含的信息就会显示在JLabels中。

我的问题不是将整个列表包含在JList中显示的每个对象中,有没有办法只显示每个列表中的某些值?例如,日期和人?我没有包含getter和setter的类,因为API响应中没有字段。

这里是窗口的代码:

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Window extends JFrame {

private JPanel contentPane;
public JList list1;
private JButton buttonSearch;
private JTextField searchField;
public JLabel nameValue;
public JLabel roleValue;
DefaultListModel listModel = new DefaultListModel();

public String passingValue;
public String passingValue2;


public Window() {
    buttonSearch.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

            try {
                clearList();

                URL apiURL = new URL("http://api.cloudquote.io/sage/getInsiderActions.json? 
     T=APIKEYHERE&symbol=GOOG");

                String readLine = null;

                HttpURLConnection conn = (HttpURLConnection) apiURL.openConnection();
                conn.setRequestMethod("GET");


                int responseCode = conn.getResponseCode();

                if (responseCode == HttpURLConnection.HTTP_OK) {

                    BufferedReader in = new BufferedReader(new 
     InputStreamReader(conn.getInputStream()));
                    StringBuffer response = new StringBuffer();
                    while ((readLine = in.readLine()) != null) {
                        response.append(readLine);
                    }
                    in.close();

                    String jsonResponse = response.toString();

                    Deserializer actions = new Gson().fromJson(jsonResponse, Deserializer.class);

                    Object[] newList = actions.getRows().toArray();

                    for (Object object : newList) {
                        listModel.addElement(object);
                    }

                    list1.setModel(listModel);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    });
    list1.addListSelectionListener(new ListSelectionListener() {
        @Override
        public void valueChanged(ListSelectionEvent e) {
            nameValue.setText("");
            roleValue.setText("");

            String stringTest = String.valueOf(list1.getSelectedValue());
            List<String> myList = new ArrayList<String>(Arrays.asList(stringTest.split(",")));

            passingValue = myList.get(0);
            passingValue2 = myList.get(2);


            nameValue.setText(passingValue);
            roleValue.setText(passingValue2);
        }
    });
     }

    public static void main(String[] args) {
    JFrame frame = new JFrame("Testing");
    frame.setContentPane(new Window().contentPane);
    frame.setPreferredSize(new Dimension(750, 500));
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);


 }

 public void clearList() {
    list1.removeAll();
 }


}

这是我的反序列化类,用于解析JSON响应:

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

   import java.util.List;

  public class Deserializer {

  @SerializedName("rows")
   @Expose
   private List<List<String>> rows = null;
  @SerializedName("columns")
  @Expose
  private List<String> columns = null;

  public List<List<String>> getRows() {
    return rows;
 }

  public void setRows(List<List<String>> rows) {
    this.rows = rows;
 }

  public List<String> getColumns() {
    return columns;
  }

  public void setColumns(List<String> columns) {
    this.columns = columns;
    }

    @Override
    public String toString() {
    return "Deserializer{" +
            "rows=" + rows +
            '}';
    }
  }

最后是JSON响应的样子:

{
"rows": [
[
  "CapitalG LP",
  1678225,
  "",
  "C",
  "2020-02-13",
  830211,
  0,
  "A",
  "I",
  830211,
  "https://www.sec.gov/Archives/edgar/data/1535527/000089924320004527/xslF345X03/doc4.xml"
]],
"columns": [
  "Insider",
  "CIK",
  "Role",
  "Transaction Code",
  "Transaction Date",
  "Shares",
  "Price Range",
  "Aquired/Disposal",
  "D/I Own",
  "Total Holdings",
  "Filing"
]
}

解决此问题的最佳方法是什么?非常感谢。

java json swing gson jlist
2个回答
0
投票

最佳方法是将数据显示在JTable(而不是JList)中。

JSON响应提供以下值:

  1. 标题和
  2. 每行数据。

创建JTable的代码将类似于:

Vector<String> columnNames = new Vector<String>();

for (String columnName; action.getColumns())
{
    columnNames.add( columnName );
}

DefaultTableModel model = new DefaultTableModel(columnNames, 0);

for (List<String> listRow; action.getRows())
{
    String[] row = listRow.toArray( new String[listRow.size()] );
    model.addRow( row );
}

JTable table = new JTable( model );
frame.add( new JScrollPane( table ) );

0
投票

如果您创建DTO然后重写该类的toString方法,这非常容易。

示例

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@ToString
@NoArgsConstructor
public class CatDTO {

    private String id;
    private String url;
    private int width;
    private int height;

    @Override
    public String toString() {
        return getId() + " -> " + getUrl();
    }

}

Attached ConsumeApiRestDemo Java Swing with JList

© www.soinside.com 2019 - 2024. All rights reserved.