我正在处理的应用程序需要使用JList,其中每个ListItem是一个Label,后跟一个Button。
我所做的是创建了一个具有Text字段的String成员的Class,并将Class Objects添加到Jlist中。
现在对于Button,我实现了一个自定义列表单元格渲染器,其格式为:
public renderer()
{
text=new JLabel();
button=new JButton("Track");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Hey");
}
});
}
public Component getListCellRendererComponent(JList list, Object value, int index,boolean isSelected, boolean cellHasFocus)
{
it=(item)list.getModel().getElementAt(index);
text.setText(it.tex);
return this;
}
public void paintComponent(Graphics g)
{
this.add(text);
this.add(button);
this.setVisible(true);
}
public Dimension getpreferredSize(){
Font font=UIManager.getDefaults().getFont("JLabel.Font");
Graphics g=getGraphics();
FontMetrics fm=g.getFontMetrics(font);
return new Dimension(fm.stringWidth(it.tex)+button.getWidth(),fm.getHeight()>button.getWidth()?fm.getHeight():button.getWidth());
}
}
但是当我点击它时按钮没有响应。我错过了什么?
由于
答案 0 :(得分:2)
为什么要使用JList,渲染器和编辑器遇到这么多麻烦,只需创建一个带有框布局的JPanel,将所有标签和按钮放在里面,然后在滚动窗格中显示该面板。代码很短,不会有任何行为上的麻烦。
一般来说,放置其他组件是JTable和JList等组件几乎总是比它的价值更麻烦。
答案 1 :(得分:1)
你也应该创建一个自定义列表单元格编辑器,它重用ListCellRenderer中的代码来实现外观,但是在按钮上实现了动作侦听器。 单元格渲染器仅用于在列表中标记图形图像。要在JList中使用控件,您应该使用单元格编辑器。
答案 2 :(得分:1)
Renderer
即将在JComponets
,JList
或JComboBox
内展示JTable
,基本上所有内容都在JList
中描述, JTable
教程,然后使用JList
,您只能
JList
你无法返回JButtons
被点击或其他JButton's events
,只能通过{JList
中的选择1}},您可以通过此事件为GUI生成等待事件,但仅限于JList
选择,而不是来自JButton
码
import java.awt.*;
import javax.swing.*;
public class ListPanel extends JFrame {
private static final long serialVersionUID = 1L;
public ListPanel() {
DefaultListModel model = new DefaultListModel();
model.addElement(createPanel("one"));
model.addElement(createPanel("two"));
model.addElement(createPanel("three"));
model.addElement(createPanel("four"));
JList list = new JList(model);
list.setCellRenderer(new PanelRenderer());
add(list);
}
public static JButton createPanel(String text) {
JButton panel = new JButton(text);
return panel;
}
public static void main(String[] args) {
ListPanel frame = new ListPanel();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
class PanelRenderer implements ListCellRenderer {
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JButton renderer = (JButton) value;
renderer.setBackground(isSelected ? Color.red : list.getBackground());
return renderer;
}
}
}
您拥有自己的Editor
工具,从未在JList
中尝试过,因为与JTable
相比,错过了import和方法,
将JList
替换为JTable
,创建JTable
而不TableHeader
,只使用Column
编辑(@Jakub Zaverka)
import java.awt.*;
import javax.swing.*;
public class ListPanel extends JFrame {
private static final long serialVersionUID = 1L;
public ListPanel() {
setLayout(new GridLayout(0, 2, 10, 10));
DefaultListModel model = new DefaultListModel();
model.addElement(createButtons("one"));
model.addElement(createButtons("two"));
model.addElement(createButtons("three"));
model.addElement(createButtons("four"));
model.addElement(createButtons("five"));
model.addElement(createButtons("six"));
model.addElement(createButtons("seven"));
model.addElement(createButtons("eight"));
model.addElement(createButtons("nine"));
model.addElement(createButtons("ten"));
model.addElement(createButtons("eleven"));
model.addElement(createButtons("twelwe"));
JList list = new JList(model);
list.setCellRenderer(new PanelRenderer());
add(new JScrollPane(list));
add(new JScrollPane(createPanel()));
}
public static JPanel createPanel() {
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(0, 1, 1, 1));
panel.add(createButtons("one"));
panel.add(createButtons("two"));
panel.add(createButtons("three"));
panel.add(createButtons("four"));
panel.add(createButtons("five"));
panel.add(createButtons("six"));
panel.add(createButtons("seven"));
panel.add(createButtons("eight"));
panel.add(createButtons("nine"));
panel.add(createButtons("ten"));
panel.add(createButtons("eleven"));
panel.add(createButtons("twelwe"));
return panel;
}
public static JButton createButtons(String text) {
JButton button = new JButton(text);
return button;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ListPanel frame = new ListPanel();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
//frame.pack();
frame.setSize(270, 200);
frame.setVisible(true);
}
});
}
class PanelRenderer implements ListCellRenderer {
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JButton renderer = (JButton) value;
renderer.setBackground(isSelected ? Color.red : list.getBackground());
return renderer;
}
}
}
答案 3 :(得分:0)
@Jakub Zaverka我同意,我已经使用过了,它运行正常。 @nikel我建议你使用GridBagLayout和GridBagConstraint来管理你的组件。