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