简体   繁体   English

如何在构造函数中将数组列表或数组放入 JList?

[英]How to put arraylist or array to JList in constructor?

My idea is to make an app in Java swing, which contains of a login window and then a kind of company chooser.我的想法是用 Java swing 制作一个应用程序,其中包含一个登录窗口和一种公司选择器。 But I need to import the company list and ID's from the json url, which is what I did, but how can I push the array in constructor into a JList ?但是我需要从 json url 导入公司列表和 ID,这就是我所做的,但是如何将构造函数中的数组推送到JList

This is my main method这是我的主要方法

import java.awt.EventQueue;

public class Main {
    public static void main(String[] args) {        
        LoginWindow loginWindow = new LoginWindow();
        loginWindow.setVisible(true);
        loginWindow.setSize(500, 400);
        //loginWindow.setDefaultCloseOperation(Exit);
    }
}

Here's my login window.这是我的登录窗口。

import java.awt.*;
import javax.swing.*;

public class LoginWindow extends JFrame {

private JLabel item1;
private JLabel item2;
private JTextField login;
private JPasswordField password;
private JButton loginButton;
private JPanel loginPanel;


GridBagConstraints gbc = new GridBagConstraints();

public static void main(String[] args) {

}

LoginWindow(){
    super("MyApp");
    setLayout(new GridBagLayout());
    gbc.insets = new Insets(5, 5, 5, 5);
    item1 = new JLabel("Login");
    gbc.gridx = 0;
    gbc.gridy = 1;
    add(item1, gbc);

    item2 = new JLabel("Password");
    gbc.gridx = 0;
    gbc.gridy = 2;
    add(item2, gbc);

    login = new JTextField(15);
    gbc.gridx = 2;
    gbc.gridy = 1;
    add(login, gbc);

    password = new JPasswordField(15);
    gbc.gridx = 2;
    gbc.gridy = 2;
    add(password, gbc);

    loginButton = new JButton("Login");     
    gbc.gridx = 2;
    gbc.gridy = 3;
    add(loginButton, gbc);

    loginButton.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            if("admin".equals(password.getText()) && 
"admin".equals(login.getText())){
                dispose();
                CompanySelectionWindow frame = new CompanySelectionWindow();
                frame.setVisible(true);
                frame.setSize(500, 300);
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
            }
            else{
        JOptionPane.showMessageDialog(null, "Wrong password or login");
            }

        }});



}

}

and here's CompanySelectionWindow这是 CompanySelectionWindow

import javax.swing.*;
import org.json.*;
import java.awt.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
import java.util.ArrayList;


public class CompanySelectionWindow extends JFrame {

private JLabel label;
private JList list;
//private JList<JSONArray> list = new JList<>();
DefaultListModel<companyInfo> model = new DefaultListModel<>();
GridBagConstraints gbc = new GridBagConstraints();


public CompanySelectionWindow() {
    super("Company Selection Window");
    //model.addElement(element);
    setLayout(new GridBagLayout());
    gbc.insets = new Insets(5, 5, 5, 5);
    label = new JLabel("Choose company:");
    gbc.gridx = 3;
    gbc.gridy = 3;
    add(label);
    **list = new JList(what and how put something here?);**
}

public static void main(String[] args) {
    String jsonString = callURL("xxx");
    System.out.println("\n\njsonString: " + jsonString);
    ArrayList<JSONObject> array = new ArrayList<>();
    //String str = "{id:\"123\",name:\"myName\"}   {id:\"456\",name:\"yetanotherName\"}{id:\"456\",name:\"anotherName\"}";
    String[] strs = jsonString.split("(?<=\\})(?=\\{)");
    for (String s : strs) {
        System.out.println(s);          
    }
    try {

        JSONArray jsonArray = new JSONArray(jsonString);

        int count = jsonArray.length(); // get totalCount of all jsonObjects
        for(int i=0 ; i< count; i++){   // iterate through jsonArray 
            JSONObject jsonObject = jsonArray.getJSONObject(i);  // get jsonObject @ i position 
            array.add(i, jsonObject);
            System.out.println("jsonObject " + i + ": " + jsonObject);
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }


}

public String[] pullArray(String[] a){
    return a;
}

public static String callURL(String myURL) {
    System.out.println("Requested URL:" + myURL);
    StringBuilder sb = new StringBuilder();
    URLConnection urlConn = null;
    InputStreamReader in = null;

    try {
        URL url = new URL(myURL);
        urlConn = url.openConnection();
        if (urlConn != null && urlConn.getInputStream() != null) {
            in = new InputStreamReader(urlConn.getInputStream(),
                    Charset.defaultCharset());
            BufferedReader bufferedReader = new BufferedReader(in);
            if (bufferedReader != null) {
                int cp;
                while ((cp = bufferedReader.read()) != -1) {
                    sb.append((char) cp);
                }
                bufferedReader.close();
            }

        }
    in.close();
    } catch (Exception e) {
        throw new RuntimeException("Exception while calling URL:"+ myURL, e);
    } 

    return sb.toString();
}

I tried to make an ArrayList and even normal array out of JSONarray and push it to JList (cause I think it'll be the right way to do it).我试图用JSONarray制作一个ArrayList甚至普通数组,并将其推送到JList (因为我认为这将是正确的方法)。 I know everything here is a bit messy.我知道这里的一切都有些凌乱。 I watched several tutorials and read some articles here and there, but i can't do it.我看了几个教程,在这里和那里阅读了一些文章,但我做不到。 Sorry for my bad English and sorry if my question is stupid :).对不起我的英语不好,如果我的问题很愚蠢,我很抱歉:)。 Thanks谢谢

Try using a DefaultListModel instead of an ArrayList:尝试使用 DefaultListModel 而不是 ArrayList:

DefaultListModel<JSONObject> array = new DefaultListModel<>();

then pass it into the JList constructor.然后将其传递给 JList 构造函数。

public CompanySelectionWindow(String []ar) {
    super("Company Selection Window");
    //model.addElement(element);
    setLayout(new GridBagLayout());
    gbc.insets = new Insets(5, 5, 5, 5);
    label = new JLabel("Choose company:");
    gbc.gridx = 3;
    gbc.gridy = 3;
    add(label);
    jList1.setListData(ar);
}

make your constructor to accept a array of your string items then call the method passing an array使您的构造函数接受您的字符串项数组,然后调用传递数组的方法

public CompanySelectionWindow(ArrayList<String> listdata) {
    super("Company Selection Window");
    //model.addElement(element);
    setLayout(new GridBagLayout());
    gbc.insets = new Insets(5, 5, 5, 5);
    label = new JLabel("Choose company:");
    gbc.gridx = 3;
    gbc.gridy = 3;
    add(label);
    jList1.setListData(listdata.toArray());
}

or you can make the constructor to accept arraylist then you can follow the above approach to add list to data或者您可以使构造函数接受 arraylist 然后您可以按照上述方法将列表添加到数据

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM