我的程序大概可以简写成如下: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控件的事件起做用的。请大家帮我想想办法。
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控件的事件起做用的。请大家帮我想想办法。
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();
}
}
因为我在修改spark的代码,其实是二次开发。它的联系人列表用的是JList,我现在想在联系人的后面加一个按钮,用户点击了之后会打开当前联系人的主页地址。我看过了他的代码,用JList还是比效好处理的,如果能加JButton就完美的,但如果不用JList改动会比较大
这样是能执行,但我的实际代码是这样的: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;
}
}
这就不行了。
renderer只是负责展示,要使上面的动作可操作,需要设置editor的。
不可编辑啊。可以使用只有一列的表格来代替。
呵呵,我都要放弃了,正常加进来是可以,但是当我用了 CellRenderer 以后就不行了,按钮显示是没有问题,但是点击就是没有反映。