Java ArrayLists转换为JList
好的,所以我只做了一小部分库存。 我把它的大部分都放下了。 我正在尝试将字符串项添加到ArrayList,然后将其添加到JList。 但是,我在编译时收到此错误:
C:\Users\Dan\Documents\DanJavaGen\inventory.java:30: cannot find symbol symbol : constructor JList(java.util.ArrayList) 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 arr = new ArrayList(); 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 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) { } }
JList提供了一个构造函数JList(Object []) ,您可以在使用toArray()解压缩ArrayList
list = new JList(arr.toArray())
尝试这个:
DefaultListModel listModel = new DefaultListModel(); for (int i = 0; i < arrayList().size(); i++) { listModel.addElement(arrayList().get(i)); } jList1.setModel(listModel);
我在导致exception的toArray()
方法时遇到了麻烦,因此我构建了一个快速通用的方法来进行转换。 也许有人会发现它也很有用。 我知道这是一个老post,但我敢打赌,它仍然不时被观看。 这是方法:
private void populateArrayFromList(T[] arr, ArrayList 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);
我的项目也遇到了toArray()和JList的问题。 做了一些研究,尝试了一些东西,发现了一些有效的东西。 希望它能帮助每个人:
ArrayList i = new ArrayList<>(); String[] str = new String[i.size()]; //Assuming there is data in your list JList list = new JList<>(i.toArray(str));
构造函数摘要
JList()
使用空的只读模型构造一个JList
。
JList(ListModel dataModel)
构造一个JList
,显示来自指定的非null模型的元素。
JList(Object[] listData)
构造一个显示指定数组中元素的JList
。
JList(Vector> listData)
构造一个显示指定Vector中元素的JList
。
我只是实现了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 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); } }); } }