【问题标题】:How to dd an object to the JList and show member of the object on the list interface to the user?如何将对象添加到 JList 并在列表界面上向用户显示对象的成员?
【发布时间】:2012-09-18 14:06:25
【问题描述】:

我有一个 ArrayList 对象,它是 cd 的类型。我想将所有对象添加到 JList 并向用户显示名称字段。我可以将 String 类型添加到 JList 但是对象的特定字段呢?

CD 是:

class CD{
    public CD(String n){name = n;}
    private String name;
    public String getName(){return name;}
    public void setName(String n){name = n;}
}

数组列表是:

ArrayList<CD> myList = new ArrayList<CD>();

现在我想将 myList 添加到 JList:

JList list = new JList(myList);
panel.add(list);
JScrollPane scrol = new JScrollPane(list);
frame.add(scrol,BorderLayout.EAST);
frame.add(panel);
frame.setVisible(true);

首先,这种方式正确吗?其次,如何在列表中显示对象的用户名字段?我想要的界面是:

左边是我的对象的名字! 提前致谢。 伯纳德

【问题讨论】:

  • 我了解摇摆。我不明白这个问题。
  • 我认为您发布的代码不正确(无法编译)... // 编辑:好的,也许它是正确的。
  • @user1329572 所以你不懂摇摆。
  • @m4tx 是的,代码只是一个示例。想象一下,您有一个对象如何将其添加到 Jlist 中,然后显示其中一个字段。

标签: java swing


【解决方案1】:

使用基于 DefaultListCellRenderer 的自定义渲染器:

import java.awt.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javax.swing.DefaultListCellRenderer;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class TestJList {

    class CD {
        public CD(String n) {
            name = n;
        }

        private String name;

        public String getName() {
            return name;
        }

        public void setName(String n) {
            name = n;
        }
    }

    protected void initUI() {
        List<CD> cds = new ArrayList<CD>();
        cds.add(new CD("MJ - Bad"));
        cds.add(new CD("Mozart - Concerto 123"));
        cds.add(new CD("Nadeah - Odile"));
        JFrame frame = new JFrame(TestJList.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JList list = new JList(new Vector<CD>(cds));
        list.setVisibleRowCount(10);
        list.setCellRenderer(new DefaultListCellRenderer() {
            @Override
            public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                Component renderer = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                if (renderer instanceof JLabel && value instanceof CD) {
                    // Here value will be of the Type 'CD'
                    ((JLabel) renderer).setText(((CD) value).getName());
                }
                return renderer;
            }
        });
        frame.add(new JScrollPane(list));
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestJList().initUI();
            }
        });
    }
}

【讨论】:

  • 非常感谢,现在我可以理解我们在哪里设置的值必须显示在列表中。伟大的工作伙伴。
  • @Bernard 欢迎您。当然,您可以随意在方法getListCellRendererComponent 中做任何您想做的事情,并设置您想要的任何文本。您也可以自己实现ListCellRendererComponent 并选择返回您喜欢的任何组件(您可以拥有一个带有嵌入标签、图像等的复杂 JPanel...)
【解决方案2】:

我认为,如果您想直接使用 JList 使用 CD 类,则需要编写自己的渲染器,它可以使用 CD 类。渲染器可以扩展JLabel 并显示name 字段的内容。

还有其他方法:for() 迭代 ArrayList 并仅将 name 字段添加到 DefaultListRenderer。你会做的方式是你的选择。

您还可以添加ListSelectionListener 以显示所选列表项的专辑详细信息。

你需要知道的都在这里:

// 感谢 kleopatra :)

【讨论】:

  • 感谢您的回复,我对swing 很陌生,这个例子很复杂。看不懂:docs.oracle.com/javase/7/docs/api/javax/swing/…
  • 是的,Swing 中的渲染器有点难以理解。你看到了吗:docs.oracle.com/javase/tutorial/uiswing/components/…?我认为您需要创建和使用渲染器的所有信息。顺便说一句,您也可以像@James 所说的那样覆盖 toString() 方法。
  • @m4tx 也覆盖 toString() - 虽然这是可能的,但在 Swing 中这是不可能的,从任意对象创建和显示字符串表示是渲染器的专属任务。这里的一般规则是:永远不要解决数据领域的视觉问题。如果您不喜欢默认的 toString,请实现一个使用您想要的属性的自定义渲染器。
  • 所以答案是正确的 [1] ,评论不是 :-) [1] 除了部分 extend JLabel - 不要:而是实现一个渲染器 extend JLabel i>使用 JLabel,最好使用 DefaultListRenderer(它负责处理所有视觉复杂性)
【解决方案3】:

JList 没有采用 ArrayList 的构造函数,但是您可以使用 Vector 或 Array(ArrayList 可以轻松转换为 Array)。

要向用户显示您想要的内容,您可以使用自定义渲染器。或者,您可以覆盖 CD 的 toString() 方法,如果我没记错的话,它是用于确定要显示什么的默认方法。

【讨论】:

  • 对不起,我对 Java 太陌生了。你的意思是我覆盖了 CD 类中的 toString?这是 public String toString(){ return getTitle(); }
  • @Bernard 而覆盖 toString() 将解决您的问题,它不是一个可维护的解决方案,不建议依赖这样的东西,因为这意味着您将您的 UI 与您的模型紧密耦合. “最好”的方式是使用渲染器。
猜你喜欢
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 2016-10-02
  • 2015-01-27
相关资源
最近更新 更多