将Java的ArrayList转换为JList

13

好的,我正在处理我的库存的一个小部分。我已经解决了大部分问题。我正在尝试将字符串项目添加到ArrayList中,然后将其添加到JList中。但是,当我编译时,我收到以下错误:

C:\Users\Dan\Documents\DanJavaGen\inventory.java:30: cannot find symbol
symbol  : constructor JList(java.util.ArrayList<java.lang.String>)
location: class javax.swing.JList
        list = new JList(arr);

这可能是我犯的新手错误... :/

代码:

import java.applet.Applet;
import java.awt.*;
import javax.swing.*;
import javax.swing.JList;
import java.awt.event.*;
import java.util.ArrayList;
import java.io.*;
import java.util.*;

public class inventory extends JApplet implements MouseListener {

public static String newline;
public static JList list;
int gold = 123;

    public void init() {



ArrayList<String> arr = new ArrayList<String>();
arr.add("Hatchet");
arr.add("Sword");
arr.add("Shield");
arr.add(gold + " Gold");
System.out.println("You have " + arr.size() + " items in your inventory.");
showInventory(arr);



        list = new JList(arr);

        add(list);

        list.addMouseListener(this);

        list.setVisible(true);

    }

public static void showInventory (ArrayList<String> theList) {
for (int i = 0; i < theList.size(); i++) {
System.out.println(theList.get(i));
}
}


    public void mousePressed(MouseEvent e) { }

    public void mouseReleased(MouseEvent e) {
        Object index = list.getSelectedValue();
       System.out.println("You have selected: " + index);
    }

    public void mouseEntered(MouseEvent e) { }

    public void mouseExited(MouseEvent e) { }

    public void mouseClicked(MouseEvent e) { }




    public void paint(Graphics g) {

    }
}
9个回答

28

JList 提供了一个构造函数 JList(E[]),您可以在使用 toArray(T[]) 解包您的 ArrayList<String> 后调用它:

list = new JList<>(arr.toArray(new String[arr.size()]))

1
很棒的帖子...但现在我又出现了一个新错误......请看我的新主题:| - test
不要问为什么,但只有在声明JList的通用变量时才能正常工作。不是JList<MyType>而是JList,否则我会遇到很多麻烦。 - Anonymous
你会得到运行时类型错误,因为我在这里搞砸了,没有提供类型安全的解决方案。你需要向ArrayList.toArray提供一个目标类型的数组。我有点尴尬错过了那个。https://dev59.com/klzUa4cB1Zd3GeqP4IcL#7876978 - Alain O'Dea
我已经纠正了上面的错误。 - Alain O'Dea

6

试试这个:

DefaultListModel listModel = new DefaultListModel();
for (int i = 0; i < arrayList().size(); i++)
{
    listModel.addElement(arrayList().get(i));
}
jList1.setModel(listModel);

2

我在使用toArray()方法时出现了异常,因此我建立了一个快速的通用方法来进行转换。或许有人也会觉得这个方法很有用。虽然这是一个旧帖子,但我相信它仍然会被人们查看。下面是这个方法:

private <T> void populateArrayFromList(T[] arr, ArrayList<T> arrayList) {
    System.out.println("Array size " + arr.length);
    System.out.println("ArrayList size " + arrayList.size());
    for (int i = 0; i < arrayList.size(); i++) {
        arr[i] = arrayList.get(i);
    }
}

在传递数组之前,先创建数组,例如:

String[] arr = new String[arrayList.size()];

那么您只需要从您的代码中调用它即可。
populateArrayFromList(arr, arrayList);

2

我在项目中使用toArray()和JList时遇到了问题。经过一些研究和尝试,我找到了一个可行的方法。希望能对大家有所帮助:

ArrayList<String> i = new ArrayList<>();
String[] str = new String[i.size()];
//Assuming there is data in your list
JList<String> list = new JList<>(i.toArray(str));

0

我只是简单地实现了ListModel接口:

    package proba;

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.util.ArrayList;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JScrollPane;
    import javax.swing.ListModel;
    import javax.swing.ListSelectionModel;
    import javax.swing.event.ListDataListener;

    public class Proba extends JFrame {
        ArrayList<String> al = new ArrayList<>();
        public Proba() {
            al.add("1111111");
            al.add("2222222");
            al.add("3333333");
            setLayout(new BorderLayout());
            MyListModel lm = new MyListModel();
            JList l = new JList(lm);
            l.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            JScrollPane sp = new JScrollPane(l);
            add(sp, BorderLayout.CENTER);
        }

        class MyListModel implements ListModel {
            @Override
            public int getSize() {
                return al.size();
            }
            @Override
            public Object getElementAt(int index) {
                return al.get(index);
            }
            @Override
            public void addListDataListener(ListDataListener l) {
            }
            @Override
            public void removeListDataListener(ListDataListener l) {
            }
        }

        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    Proba app = new Proba();
                    app.setSize(600, 480);
                    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    app.setVisible(true);
                }
            });
        }
    }

0
若您需要在MySQL中使用循环来获取数据,可以按照下面的方式编写代码:

     while(result.next()){
     itemid = result.getInt("id");
     itempice = result.getInt("price");
     itemname = result.getString("itemname");
     arraylist.add(itemname+" Price: "+itempice);
     }
     jList.setListData(arraylist.toArray());

你在哪里找到了 setListData 函数? - Harshan Morawaka

0
如果您正在使用拖放组件,则将列表命名为“itemList”,我假设arr是包含一些字符串数据的ArrayList的名称,则:
`DefaultComboBoxModel model=
new DefaultComboBoxModel(arr.toArray(new String[arr.size()]));
itemList.setModel(model);`

希望这对你有用。


0

构造函数概要
JList() 构造一个带有空的只读模型的 JList
JList(ListModel dataModel) 构造一个显示指定非空模型元素的 JList
JList(Object[] listData) 构造一个显示指定数组元素的 JList
JList(Vector<?> listData) 构造一个显示指定 Vector 中元素的 JList


0

您可以将Object超类作为JList的类型进行传递。

ArrayList<String> arr = new ArrayList<String>();

arr.add("Hatchet");
arr.add("Sword");
arr.add("Shield");

JList<Object> list = JList<Object>(arr.toArray());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接