【问题标题】:How to rename list of Object[] in a JList如何重命名 JList 中的 Object[] 列表
【发布时间】:2020-04-15 12:57:31
【问题描述】:

这里是初学者。

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

我的问题是关于后者。我遍历列表并将每一行添加到 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


    【解决方案1】:

    最好的方法是在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 ) );
    

    【讨论】:

    • 感谢@camickr,这就是我最初的展示方式。但我认为交易清单会是一种有趣的数据组织方式。我想我会坚持使用 JTables !
    • 这是一个交易列表。不同之处在于您实际上可以读取交易数据,而无需先单击特定行。您可以轻松地将表格更改为仅显示几列,然后如果您单击一行,如果您愿意,可以显示该行的其余数据。无论如何,很高兴它有所帮助。不要忘记通过单击复选标记“接受”答案,这样人们就知道问题已经解决了。
    • 我接受了对不起,是的,我将制作一张自定义表格。再次感谢您的宝贵时间
    【解决方案2】:

    如果你创建一个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

    【讨论】:

    • 除非我在这里遗漏了什么,否则我不能使用 getter 和 setter,因为在 JSON 响应中没有可供我指向的字段。有什么我不明白的吗?
    • 对不起。在示例中,使用自动创建 getter、setter 和 toString 的 lombok 库。有关 Java,请参阅 projectlombok.org。手动创建 getter 和 setter 也是有效的
    • 我明白,但是您需要指向字段来创建 getter 和 setter,不是吗?查看 JSON 响应及其格式,它是行和列的列表,而不是格式:{"id": "123", "url": "etc"..} 因此我说我可以不要为像 getID() 这样的特定字段创建 getter 和 setter。无论如何,感谢您的帮助
    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 2010-10-22
    • 2018-11-16
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2015-08-03
    • 2017-03-20
    相关资源
    最近更新 更多