有没有一种方法可以获取JList中的所有元素?

17

我想知道是否有一种方法可以检索添加到JList中的所有元素的列表。例如,我希望JList从自定义单元格渲染器返回一个字符串或JLabel数组或列表。


3
是的,有方法。可能有几种。检查每种方法的文档,以及如何使用列表 - Andrew Thompson
http://docs.oracle.com/javase/tutorial/uiswing/components/list.html - JB Nizet
5个回答

26

您可以使用getModel方法获得ListModel。然后使用getElementAtgetSize方法来构建数组、列表或其他您需要的东西。


14
请注意,如果您正在使用 DefaultListModel,则可以使用方法 toArray() 来获取所有元素的数组。 - PhoneixS

4
当然可以。你需要用循环结构来调用getElementAt()方法。
示例代码如下:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.WindowConstants;

public class Jlist {
    JFrame frame;
    JList<String> list;
    JButton button;

    public Jlist(){
        init();
    }

    public void init(){
        frame = new JFrame("Sample");
        frame.setSize(300, 300);
        frame.setLayout(new  BorderLayout(30, 30));

        DefaultListModel<String> model = new DefaultListModel<>();
        model.addElement("A");
        model.addElement("B");
        model.addElement("C");
        model.addElement("D");
        model.addElement("E");

        list = new JList<>();

        list.setModel(model);
        JScrollPane pane = new JScrollPane(list);
        pane.setViewportView(list);

        button = new JButton("Get");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                buttonActionPerformed();
            }
        });


        frame.add(pane, BorderLayout.NORTH);
        frame.add(button, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
    public void buttonActionPerformed(){
        for(int i = 0; i< list.getModel().getSize();i++){
            System.out.println(list.getModel().getElementAt(i));
        }
    }
    public static void main(String[] args) {
        new Jlist();
    }
}

2

我还没看到有人使用最简洁的方法来做这件事。假设你正在使用 Java 8+:

IntStream.range(0,listModel.size()).mapToObj(listModel::get).collect(Collectors.toList());

我个人更喜欢它,胜过任何循环方法。

1
尝试这个...
 String[] myArray = new String[50];
    for (int i = 0; i < jList1.getModel().getSize(); i++) {
             myArray[i] = String.valueOf(jList1.getModel().getElementAt(i));
        }

0

此外,我们可以使用消息对话框从名为 myL 的 JList 中获取元素,因此您可以使用以下方法对 JButton 对象执行操作。

String item = myL.getSelectedValue();
if( item == null ){
    JOptionPane.showMessageDialog(null,  "Not selected yet");
}else{
    JOptionPane.showMessageDialog(null, item);
}

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