0

新手来了

当我在 DefaultListModel 中添加一个元素时,我使用了一个覆盖 toString 的类。根据下面的示例代码,我想在单击按钮 btnid 时显示所选项目的 ID。

displayID 下的命令似乎不起作用。请帮忙。谢谢!

class SomeClass {
JFrame f = new JFrame("Sample");
JScrollPane sp = new JScrollPane();
DefaultListModel dlm = new DefaultListModel();
JList lst = new JList(dlm);

public SomeClass() {
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JButton btnadd = new JButton("Add");
    JButton btnid = new JButton("View ID");

    Container p = f.getContentPane();
    sp.getViewport().add(lst,null);    

    p.add(sp, BorderLayout.WEST);
    p.add(btnadd, BorderLayout.EAST);
    p.add(btnid, BorderLayout.SOUTH);

    btnadd.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
          dlm.addElement(new ElementDisplay(dlm.getSize(),"Element " + dlm.getSize()));  
      }
    });

    btnid.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
          displayID();
      }
    });

  f.pack();
  f.setVisible(true);    
 }

private void displayID() {
    ElementDisplay ed;

    ed = dlm.getElementAt(lst.getSelectedIndex());    

    System.out.println(ed.elementID);
}

public static void main(String args[]) {
  SomeClass sc = new SomeClass();
}


class ElementDisplay {
    public int elementID;
    private String elementDescription;

    public ElementDisplay(int pid, String pdesc) {
        elementID=pid;     
        elementDescription=pdesc;
    }

    @Override
    public String toString() {
        return elementDescription;
    }
}
}
4

1 回答 1

0

对我来说很好。是什么让你认为它不起作用?您实际上需要在列表中选择一个项目才能按下按钮工作,您将获得ArrayIndexOutOfBoundException

无需依赖按钮按下,只需将侦听器添加到JList. That way only when the item in the JListis selected, does it print. 不需要按钮并试图避免ArrayIndexOutOfBoundException

 lst.addListSelectionListener(new ListSelectionListener() {

     @Override
     public void valueChanged(ListSelectionEvent e) {
         if (e.getValueIsAdjusting()) {
              JList list = (JList)e.getSource();
              DefaultListModel model = (DefaultListModel)list.getModel();
              ElementDisplay ed = (ElementDisplay) model.getElementAt(lst.getSelectedIndex());
              System.out.println(ed.elementID);
         }
     }
 });

请参阅如何编写事件侦听器,您将在其中遇到可用于不同组件的可能侦听器。由于 GUI 是事件驱动的,因此您应该花时间学习其中的大部分。

于 2014-02-16T13:17:04.303 回答