Как переименовать список Object [] в JList - PullRequest
0 голосов
/ 15 апреля 2020

новичок здесь.

Я работаю в приложении для отображения информации для пользователей о различных компаниях. Я получаю информацию через API в разных форматах, в некоторых есть поля, которые облегчают десериализацию, а в других ответах содержится только список столбцов и список> строк. Я воссоздал минимальный JFrame, чтобы показать мою проблему:

enter image description here

Мой вопрос о последнем. Я перебираю список и добавляю каждую строку в JList, и после выбора информация, содержащаяся в этом списке, отображается в JLabels.

Вместо того, чтобы весь список, содержащийся в каждом объекте, отображался в JList, есть ли способ отображать только определенные значения из каждого списка? Например, Дата и Персона? У меня нет класса с геттерами и сеттерами, потому что в ответе 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"
]
}

Каков наилучший подход к решению этой проблемы? Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Это очень просто, если вы создаете 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 Качайте с JList

0 голосов
/ 15 апреля 2020

Наилучшим подходом было бы отображение данных в 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 ) );
...