Java 将对象添加到JList以在滚动窗格上显示时遇到问题

Java 将对象添加到JList以在滚动窗格上显示时遇到问题,java,swing,jlist,Java,Swing,Jlist,我曾为我制作的对象创建defaultlistcellrender,但到目前为止,将对象添加到JList非常困难。我附上代码的任何建议。谢谢 public class JTabbedPaneTester extends JFrame { private List<Human> members = new ArrayList<Human>(); private JList newbie = new JList(); private DefaultLi

我曾为我制作的对象创建defaultlistcellrender,但到目前为止,将对象添加到JList非常困难。我附上代码的任何建议。谢谢

public class JTabbedPaneTester extends JFrame 
{
    private List<Human> members = new ArrayList<Human>();
    private JList newbie = new JList();
    private DefaultListModel model = new DefaultListModel();

    public JTabbedPaneTester() throws FileNotFoundException
    {
        super("JTabbedPane Demo");
        JTabbedPane tabbedPane = new JTabbedPane(); 
        JPanel gladiator = new JPanel();
        getContentPane().add(gladiator); 
        tabbedPane.addTab("Gladiator", null, Gladiator, "");
        Box listOfPlayers = Box.createVerticalBox();
        listOfPlayers.add(Box.createRigidArea(new Dimension(100,100)));
        listOfPlayers.setBorder(new TitledBorder("List of Players"));
        JScrollPane playerViewer = new JScrollPane();
        playerViewer.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        listOfPlayers.add(playerViewer);
        JButton AddIndividual = new JButton("Add a Player");
        listOfPlayers.add(addIndividual);
        gladiator.add(listOfPlayers);
    final HumanListModel modelx = new HumanListModel();
    final JTable newbiex = new JTable(modelx);
    newbiex.setDefaultRenderer(Human.class, new HumanRenderer());
    playerViewer.setViewportView(newbiex);

    addIndividual.addActionListener(new ActionListener()
    {

        public void actionPerformed(ActionEvent event)
        {
                    Human temp;
                try {
                    temp = new Human();     
                    modelx.addHuman(temp);
                        } 
                    catch (FileNotFoundException e) 
                        {
                            e.printStackTrace();
                        }       
                    }
        });
        add(tabbedPane); 
    }
}       

您需要将对象添加到模型中,而不是添加到jlist面板中。添加用于组件的。尝试从jlist获取模型,并使用模型的附加元素

您使用的是
DefaultListModel
,它使用
DefaultListCellRenderer
。我看不到您的代码中有任何部分实际使用了
HumanRenderer
。你必须编写自己的模型

public class HumanListModel extends DefaultListModel
{
    private ArrayList<Human> data;

    public HumanListModel()
    {
        super();
        data = new ArrayList<Human>();
    }

    public void addHuman(Human h)
    {
       // add new human to the model
       data.add(h);
       fireTableStructureChanged();
    }

    public void removeHuman(Human h)
    {
        data.remove(h);
        fireTableStructureChanged();
    }

    @Override
    public int getColumnCount()
    {
        // the number of columns you want to display
        return 1;
    }

    @Override
    public int getRowCount()
    {
        return data.size();
    }

    @Override
    public Object getValueAt(int row, int col)
    {
        return (row < data.size()) ? data.get(row) : null;
    }

    @Override
    public String getColumnName(int col)
    {
        return "Human";
    }

    @Override
    public Class getColumnClass(int col)
    {
        return Human.class;
    }
}

我希望它能工作…

在您修复变量名之前,我甚至不打算查看代码。变量名不应以大写字符开头。也不要在每行代码之间留一个空行。要一眼就能看到所有代码,需要进行太多的滚动。1)要更快获得更好的帮助,请发布一篇文章。2) 一行空白就足够了。3) 请学习类、方法和属性名称的通用(特别是用于名称的大小写),并一致使用它们。4) 不要延伸框架或其他顶级容器。而是创建并使用一个实例。您通过在构造函数中重新声明模型变量来隐藏它。我找不到使用
HumanRenderer
的部分。如果你不使用它,为什么你有它?应该类似于
newbie.setDefaultRenderer(Human.class,newHumanRenderer())确定我更改了所有变量以小写字母开头。谢谢你让我知道。嘿,丹尼尔,你把那行代码插入哪里?此外,我不知道SSCCE是什么。在向模型添加对象时,无需验证或重新绘制。谢谢,如果我更改面板内容,我很可能会以某种方式使用它。但是我认为在这里它是不需要的,因为模型中的侦听器对吗?正确。当数据更改时,模型应调用fireXXX方法。1++1,用于将对象添加到
模型
,但正如气垫船所指出的,您定义了2个模型变量。摆脱实例变量。谢谢,我一定会尝试让它工作,我不太了解自定义单元格渲染器的编码,这就是为什么我在使用它时遇到如此麻烦的原因。不,你不必编写自己的模型。DefaultListModel可以正常工作,但您必须在JList上设置自定义渲染器。嗨,Daniel,不幸的是,我仍然无法让它工作。我希望它只是在每次点击按钮时添加一个新的随机生成的人。JList或JTable即使已声明,也无法显示人类对象内容,这会有什么问题?
public class HumanListModel extends DefaultListModel
{
    private ArrayList<Human> data;

    public HumanListModel()
    {
        super();
        data = new ArrayList<Human>();
    }

    public void addHuman(Human h)
    {
       // add new human to the model
       data.add(h);
       fireTableStructureChanged();
    }

    public void removeHuman(Human h)
    {
        data.remove(h);
        fireTableStructureChanged();
    }

    @Override
    public int getColumnCount()
    {
        // the number of columns you want to display
        return 1;
    }

    @Override
    public int getRowCount()
    {
        return data.size();
    }

    @Override
    public Object getValueAt(int row, int col)
    {
        return (row < data.size()) ? data.get(row) : null;
    }

    @Override
    public String getColumnName(int col)
    {
        return "Human";
    }

    @Override
    public Class getColumnClass(int col)
    {
        return Human.class;
    }
}
HumanListModel model = new HumanListModel();
JTable newbies = new JTable(model);
newbies.setDefaultRenderer(Human.class, new HumanRenderer());