无法将对象添加到JList以显示在滚动窗格上

时间:2013-05-27 03:57:50

标签: java swing jlist

我已经为我所创建的对象创建了一个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); 
    }
}       

这里的渲染器有人在这里很好地帮助了我

class HumanRenderer extends DefaultListCellRenderer

        {
           public Component getListCellRendererComponent(JList list, Object value,
              int index, boolean isSelected, boolean cellHasFocus) 
           {


              JLabel label = new JLabel(); 
              if (value != null) 
              {
                 Human human = (Human) value;
                 label.setText(human.getSurname() + ", " + human.getFirstName());
              }

              return label;
           }
        }

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您正在使用使用DefaultListModel的{​​{1}}。我发现您的代码中没有任何部分实际使用了您的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; } } ,您只需设置JTable并定义渲染器即可。之后,您应该在模型上直接对数据进行所有更改。使用:HumanListModelmodel.addHuman()。他们发射了model.removeHuman()为了重新绘制而监听的必要事件。

JTable

我希望它有效......