Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将对象添加到JList并在列表界面上向用户显示对象的成员?_Java_Swing - Fatal编程技术网

Java 如何将对象添加到JList并在列表界面上向用户显示对象的成员?

Java 如何将对象添加到JList并在列表界面上向用户显示对象的成员?,java,swing,Java,Swing,我有一个对象的ArrayList,它是cd的类型。我想将所有对象添加到JList,并向用户显示名称字段。我可以将字符串类型添加到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;} } Arr

我有一个对象的ArrayList,它是cd的类型。我想将所有对象添加到JList,并向用户显示名称字段。我可以将字符串类型添加到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是:

ArrayList<CD> myList = new ArrayList<CD>();
首先,这种方式正确吗?其次,如何在列表中显示对象的用户名字段?我想要的界面是:

左边是我的对象的名称! 提前谢谢。
Bernard

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

还有另一种方法:
for()
迭代
ArrayList
,只将
name
字段添加到
DefaultListRenderer
。你将如何做是你的选择

您还可以添加
ListSelectionListener
,以显示所选列表项的唱片集详细信息

您需要知道的是:


//感谢kleopatra:)

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


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

使用基于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();
            }
        });
    }
}
导入java.awt.Component;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Vector;
导入javax.swing.DefaultListCellRenderer;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JList;
导入javax.swing.JScrollPane;
导入javax.swing.SwingUtilities;
公共类测试列表{
类光盘{
公共CD(字符串n){
name=n;
}
私有字符串名称;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串n){
name=n;
}
}
受保护的void initUI(){
List cds=new ArrayList();
添加(新CD(“MJ-坏”);
CD.add(新CD(“莫扎特协奏曲123”);
新增光盘(新光盘(“Nadeah-Odile”);
JFrame=newjframe(TestJList.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JList list=新JList(新向量(cds));
list.setVisibleRowCount(10);
setCellRenderer(新的DefaultListCellRenderer(){
@凌驾
公共组件getListCellRenderComponent(JList列表、对象值、int索引、布尔isSelected、布尔cellHasFocus){
组件呈现器=super.getListCellRenderComponent(列表、值、索引、isSelected、cellHasFocus);
if(渲染器JLabel实例和值CD实例){
//此处的值将为“CD”类型
((JLabel)renderer.setText((CD)value.getName());
}
返回渲染器;
}
});
frame.add(新的JScrollPane(列表));
frame.pack();
frame.setVisible(true);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
新的TestJList().initUI();
}
});
}
}

我理解swing。我不明白这个问题。我认为你发布的代码不正确(不可编译)…/编辑:好的,也许它是正确的。@user1329572所以你不理解swing。@m4tx是的,代码只是一个示例。假设您有一个对象,如何将其添加到Jlist,然后显示其字段之一。感谢您的回复,我对swing非常陌生,这个示例非常复杂。我不明白:是的,Swing中的渲染器有点难以理解。你看到这个了吗?我认为有所有的信息,你需要创建和使用你的渲染器。顺便说一句,您还可以重写toString()方法,如@James said.@m4tx还可以重写toString()-虽然这是可能的,但这是Swing中的一个禁忌,从任意对象创建和显示字符串表示是渲染器的专有任务。这里的一般规则是:永远不要解决数据领域中的可视化问题。如果您不喜欢默认的toString,请实现一个使用所需属性的自定义渲染器。因此答案是正确的[1],注释不是:-)[1],除了扩展JLabel部分-不要:而是实现一个使用JLabel的渲染器,最好是DefaultListRenderer(它会处理所有复杂的视觉问题)对不起,我对Java太陌生了。你的意思是我重写CD类中的toString?这是公共字符串toString(){return getTitle();}@Bernard重写toString()将解决您的问题,但它不是一个可维护的解决方案,不建议依赖这种方法,因为这将意味着您的UI与模型紧密耦合。“最好”的方法是使用渲染器。谢谢,现在我可以理解我们在哪里设置必须显示在列表上的值。很好的工作伙伴。@Bernard不客气。当然,可以在方法
getListCellRenderComponent
中随意执行任何操作,并设置任何文本。您还可以实现自己的
ListCellRenderComponent
,并选择返回您喜欢的任何组件(您可以有一个带有嵌入式标签、图像等的复杂JPanel)
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();
            }
        });
    }
}