Java JButton不响应单击事件

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() {

我正在使用的应用程序需要使用JList,其中每个ListItem都是一个标签,后跟一个按钮

我所做的是为文本字段创建了一个具有字符串成员的类,并将类对象添加到Jlist中

现在,对于按钮,我实现了一个自定义列表单元渲染器,如下所示:

    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的事件
    ,只能通过
    JList
    中的选择,通过这个事件你可以生成等待事件到GUI,但只能通过
    JList
    选择,不是从
    JButton
代码

  • 您有自己的
    编辑器
    ,从未在
    JList
    中尝试过,因为与
    JTable
    相比,缺少导入和方法

  • JList
    替换为
    JTable
    ,创建
    JTable
    ,不使用
    TableHeader
    ,只使用一列

  • ,

编辑(@Jakub Zaverka)

  • Renderer
    只打算在
    JList
    JComboBox
    JTable
    中显示和格式化
    JComponets
    ,基本上所有内容都在
    JList
    JTable
    教程中描述,然后使用
    JList
    您只能

  • 也许我错了,但我认为除此之外,从
    JList
    你不能返回
    JButtons
    被点击,或者另一个
    JButton的事件
    ,只能通过
    JList
    中的选择,通过这个事件你可以生成等待事件到GUI,但只能通过
    JList
    选择,不是从
    JButton
代码

  • 您有自己的
    编辑器
    ,从未在
    JList
    中尝试过,因为与
    JTable
    相比,缺少导入和方法

  • JList
    替换为
    JTable
    ,创建
    JTable
    ,不使用
    TableHeader
    ,只使用一列

  • ,

编辑(@Jakub Zaverka)


当您可以简单地创建一个带有方框布局的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;
        }
    }
}