Java 将对象添加到JList以在滚动窗格上显示时遇到问题
我曾为我制作的对象创建defaultlistcellrender,但到目前为止,将对象添加到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
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());