java - 如何在 java 中的 DefaultListModel 中保存数据

标签 java swing jlist defaultlistmodel

我正在尝试使用 JList/DefaultListModel 制作一个列表,该列表本身包含数据。

这是我的问题。

DefaultListModel my_docs = new DefaultListModel();
JList my_jlist = new JList(my_docs);
// From here, I add elements to my_docs..
my_docs.addElement("Document 1");
my_docs.addElement("Document 2");
my_docs.addElement("Document 3");

我该怎么做才能将每​​个文档的文本(平均约 4,000 字节)保存在元素中,直到被点击才分配给另一个变量?

例如,如果我单击列表中的文档 2,文档的文本将被分配给一个变量。如果我单击列表中的文档 1,它会执行相同的操作。

很抱歉在信息太少的情况下提出这个问题,我只是不知道从哪里开始。

最佳答案

您可以为文档创建一个包装器。例如,包装器可以公开数据和名称。如果需要,也可以按需加载数据。将包装器的实例添加到列表中。使用文档名称呈现列表的每个条目。选择列表中的条目后,使用所选项目进行处理。下面是一个显示文档列表的简单示例。选择文档后,其内容将显示在文本区域中。

import java.awt.BorderLayout;
import java.awt.Component;
import javax.swing.*;
import javax.swing.event.*;

public class TestListModel {
    public TestListModel() {

        DefaultListModel model = new DefaultListModel();
        model.addElement(new DocumentWrapper("Doc 1", "Doc 1 data"));
        model.addElement(new DocumentWrapper("Doc 2", "Doc 2 data"));
        model.addElement(new DocumentWrapper("Doc 3", "Doc 3 data"));

        final JList list = new JList();

        final JTextArea output = new JTextArea(5, 40);
        list.setModel(model);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        list.setCellRenderer(new DocumentWrapperRenderer());

        list.getSelectionModel().addListSelectionListener(
                new ListSelectionListener() {
                    @Override
                    public void valueChanged(ListSelectionEvent e) {
                        if (!e.getValueIsAdjusting()) {
                            DocumentWrapper docWrapper = (DocumentWrapper) list
                                    .getSelectedValue();
                            if (docWrapper != null) {
                                output.setText(docWrapper.getData());
                            } else {
                                output.setText("");
                            }
                        }
                    }
                });

        JFrame frame = new JFrame("Document list");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JScrollPane(list));
        frame.add(output, BorderLayout.SOUTH);
        frame.setLocationByPlatform(true);
        frame.pack();
        frame.setVisible(true);
    }

    public class DocumentWrapper {
        private String data;
        private String name;

        public DocumentWrapper(String name, String data) {
            this.name = name;
            this.data = data;
        }

        public String getData() {
            return data;
        }

        public String getName() {
            return name;
        }
    }


    public static class DocumentWrapperRenderer extends DefaultListCellRenderer {
        @Override
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean hasFocus) {
            if (value instanceof DocumentWrapper) {
                return super.getListCellRendererComponent(
                        list, ((DocumentWrapper) value).getName(), index,
                        isSelected, hasFocus);
            }
            return super.getListCellRendererComponent(list, value, index, 
                    isSelected, hasFocus);
        }
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestListModel();
            }
        });
    }
}

关于java - 如何在 java 中的 DefaultListModel 中保存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16004005/

相关文章:

java - 如何在JList中只显示文件名?

java - ArrayList<String> 类型中的方法 add(String) 不适用于参数 (Object)

java - 使用JAVA打印 "Bixolon Thermal Printer", "No pages found!"错误

java - Nashorn CommandListener$$NashornJavaAdapter 无法转换为 CommandListener

java - 除非我将所有内容都放在一个类中,否则 JMenuBar 不会出现

java - 换行属性 JEditorPane

Java - GridBagLayout位置JLabel

java - JList 文件夹中所有文件名

java - jersey - StreamingOutput 作为响应实体

java - 手动创建 EntityManagerFactory?