Java JButton不响应单击事件
我正在使用的应用程序需要使用JList,其中每个ListItem都是一个标签,后跟一个按钮 我所做的是为文本字段创建了一个具有字符串成员的类,并将类对象添加到Jlist中 现在,对于按钮,我实现了一个自定义列表单元渲染器,如下所示:Java JButton不响应单击事件,java,swing,jbutton,jlist,Java,Swing,Jbutton,Jlist,我正在使用的应用程序需要使用JList,其中每个ListItem都是一个标签,后跟一个按钮 我所做的是为文本字段创建了一个具有字符串成员的类,并将类对象添加到Jlist中 现在,对于按钮,我实现了一个自定义列表单元渲染器,如下所示: public renderer() { text=new JLabel(); button=new JButton("Track"); button.addActionListener(new ActionListener() {
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());
}
}
但当我点击按钮时,它没有响应。我错过了什么
谢谢您也应该创建一个自定义的列表单元格编辑器,它可以重用ListCellRenderer中的代码进行外观设计,但会在按钮上实现操作侦听器。
单元格渲染器仅用于在列表中标记图形图像。要在JList中使用控件,您应该使用单元格编辑器。您还应该创建一个自定义列表单元格编辑器,它重用ListCellRenderer中的代码进行外观,但在按钮上实现操作侦听器。 单元格渲染器仅用于在列表中标记图形图像。要在JList中使用控件,应使用单元格编辑器。
只打算在Renderer
、JList
或JComboBox
中显示和格式化JTable
,基本上所有内容都在JComponets
和JList
教程中描述,然后使用JTable
您只能JList
- 也许我错了,但我认为除此之外,从
你不能返回JList
被点击,或者另一个JButtons
,只能通过JButton的事件
中的选择,通过这个事件你可以生成等待事件到GUI,但只能通过JList
选择,不是从JList
JButton
- 您有自己的
,从未在编辑器
中尝试过,因为与JList
相比,缺少导入和方法JTable
- 将
替换为JList
,创建JTable
,不使用JTable
,只使用一列TableHeader
- ,
只打算在Renderer
、JList
或JComboBox
中显示和格式化JTable
,基本上所有内容都在JComponets
和JList
教程中描述,然后使用JTable
您只能JList
- 也许我错了,但我认为除此之外,从
你不能返回JList
被点击,或者另一个JButtons
,只能通过JButton的事件
中的选择,通过这个事件你可以生成等待事件到GUI,但只能通过JList
选择,不是从JList
JButton
- 您有自己的
,从未在编辑器
中尝试过,因为与JList
相比,缺少导入和方法JTable
- 将
替换为JList
,创建JTable
,不使用JTable
,只使用一列TableHeader
- ,
当您可以简单地创建一个带有方框布局的JPanel,将所有标签和按钮放入其中,然后在滚动窗格中显示此面板时,为什么要在JList、渲染器和编辑器方面遇到这么多麻烦呢。代码很短,不会有任何行为问题
一般来说,放置其他组件通常比放置JTable和JList等组件麻烦得多。当您可以简单地创建一个带有方框布局的JPanel,将所有标签和按钮放在其中,然后在滚动窗格中显示此面板时,为什么要使用JList、渲染器和编辑器遇到这么多麻烦呢。代码很短,不会有任何行为问题
一般来说,放置其他组件就是JTable和JList之类的组件,这几乎总是比它的价值更麻烦。@Jakub Zaverka我同意,我已经使用了它,它工作得很好。
@nikel我建议您使用GridBagLayout和GridBagConstraint来管理组件 @Jakub Zaverka我同意,我已经用过了,而且效果很好。
@nikel我建议您使用GridBagLayout和GridBagConstraint来管理组件 为了更快地获得更好的帮助,请发布一个。此外,在使用代码格式化时,请注意查看输出。最后一个
}
不是代码格式。请学习java命名约定并遵守它们。要更快地获得更好的帮助,请发布一篇文章。此外,在使用代码格式化时,请注意查看输出。最后一个}
不是代码格式。请学习java命名约定并遵守它们。但与JList或JTable相比,滚动是不自然的,需要自定义滚动增量+1@mKorbel我不同意。与JPanel返回点相比,JPanel的滚动方式与JTable或JList.JList/JTable retuns行中的方式相同:-)@mKorbel我已经完成了精简,它的工作方式与JList相同。没有什么特别的,最好是有一次试着和…:-)比较一下,请参阅此处我的(取消删除)帖子,但与JList或JTable相比,滚动是不自然的,需要自定义滚动增量+1@mKorbel我不同意。与JPanel返回点相比,JPanel的滚动方式与JTable或JList.JList/JTable retuns行中的方式相同:-)@mKorbel我已经完成了精简,它的工作方式与JList相同。没有什么特别的,最好是有一次试着和…:-)比较一下,请参阅我的(un_delete of)帖子+1以解释呈现程序,-1用于编辑器:核心JList没有可编辑性的概念+1用于解释呈现程序,-1用于编辑器:核心JList没有可编辑性的概念
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;
}
}
}
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;
}
}
}