我的程序大概可以简写成如下:JList list = new JList();
JPanel panel = new JPanel();
JLabel label = new JLabel("郭靖");
JButton btn = new JButton("按钮");
btn.setToolTipText("发送邮件");panel.add(label);
panel.add(btn);list.add(panel);现在的问题按钮不能执行,而且加的tip也没有显示出来。我在网上查了很多资料,都是可以在JList的直接子控件上加事件的,也就是在panel可以加事件,但没有讲怎么能让JButton控件的事件起做用的。请大家帮我想想办法。

解决方案 »

  1.   

    这个需要自己实现JList的CellRenderer和CellEditor
      

  2.   

    我奇怪的是lz为什么铁了心要把JList当作一个组件容器来放置JButton?
      

  3.   

    简单点的,事件是能够被激发的。import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JPanel;
    public class JListDemo {
    public JListDemo() {
    JFrame jf = new JFrame();
    jf.setSize(200, 200);
    JList list = new JList();
    JPanel panel = new JPanel();
    JLabel label = new JLabel("郭靖");
    JButton btn = new JButton("按钮");
    btn.setToolTipText("发送邮件");
    btn.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    System.out.println("test");
    }
    });
    panel.setSize(50, 50);
    panel.add(label);
    panel.add(btn);
    list.add(panel);
    jf.add(list);
    jf.setVisible(true);
    }
    public static void main(String[] args) {
    new JListDemo();
    }
    }
      

  4.   


    因为我在修改spark的代码,其实是二次开发。它的联系人列表用的是JList,我现在想在联系人的后面加一个按钮,用户点击了之后会打开当前联系人的主页地址。我看过了他的代码,用JList还是比效好处理的,如果能加JButton就完美的,但如果不用JList改动会比较大
      

  5.   


    这样是能执行,但我的实际代码是这样的:import java.awt.Color;
    import java.awt.Component;
    import java.awt.GridBagConstraints;
    import java.awt.Insets;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.BorderFactory;
    import javax.swing.DefaultListModel;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.ListCellRenderer;
    import javax.swing.UIManager;public class JListDemo{    public JListDemo() {
            JFrame jf = new JFrame();
            jf.setSize(500, 300);        DefaultListModel model = new DefaultListModel();
            JList list = new JList(model);
            list.setCellRenderer(new JPanelRenderer());
            
            JPanel panel1 = new JPanel();
            panel1.setSize(300, 50);        JButton btn = new JButton("按钮1");
            btn.setToolTipText("发送邮件");
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("test");
                }
            });
            
            panel1.add(new JLabel("郭靖1"), new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 25, 0, 0), 0, 0));
            panel1.add(btn, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 25, 0, 0), 0, 0));
            
            model.addElement(panel1);        jf.add(list);
            jf.setVisible(true);
        }    public static void main(String[] args) {
            new JListDemo();
        }
    }class JPanelRenderer extends JPanel implements ListCellRenderer {    /**
         * Construct Default JPanelRenderer.
         */
        public JPanelRenderer() {
            setOpaque(true);
        }    public Component getListCellRendererComponent(JList list,
                                                      Object value,
                                                      int index,
                                                      boolean isSelected,
                                                      boolean cellHasFocus) {
            JPanel panel = (JPanel)value;
            panel.setFocusable(true);        if (isSelected) {
                panel.setForeground((Color)UIManager.get("List.selectionForeground"));
                panel.setBackground((Color)UIManager.get("List.selectionBackground"));
                panel.setBorder(BorderFactory.createLineBorder((Color)UIManager.get("List.selectionBorder")));
            }
            else {
                panel.setBackground(list.getBackground());
                panel.setForeground(list.getForeground());
                panel.setBorder(BorderFactory.createLineBorder((Color)UIManager.get("List.background")));
            }        list.setBackground((Color)UIManager.get("List.background"));
            return (JPanel)value;
        }
    }
    这就不行了。
      

  6.   

    啊呀,没有editor啊。
    renderer只是负责展示,要使上面的动作可操作,需要设置editor的。
      

  7.   

     不过JList是没有这个功能的。
    不可编辑啊。可以使用只有一列的表格来代替。
      

  8.   

    JList中绝对可以放JButton的,如果你的按钮做得好看一点,如用一个小图片,效果会非常不错的,你去好好的看一下CellRenderer和CellEditor的内容就能做出来.
      

  9.   


    呵呵,我都要放弃了,正常加进来是可以,但是当我用了 CellRenderer 以后就不行了,按钮显示是没有问题,但是点击就是没有反映。