【问题标题】:JButton not Responding to Click EventsJButton 不响应点击事件
【发布时间】:2012-03-27 09:25:15
【问题描述】:

我正在处理的应用程序需要使用 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());
}
}

但是当我点击它时按钮没有响应。我错过了什么?

谢谢

【问题讨论】:

  • 如需尽快获得更好的帮助,请发布SSCCE。此外,在使用代码格式化时,请注意查看输出。最后一个} 未格式化。
  • 请学习java命名约定并遵守它们。

标签: java swing jbutton jlist


【解决方案1】:

为什么要在 JList、渲染器和编辑器上遇到这么多麻烦,当您可以简单地创建一个带有框布局的 JPanel,将所有标签和按钮放入其中,然后在滚动窗格中显示此面板时。代码会很短,不会有任何行为问题。

一般来说,放其他组件是JTable和JList等组件,几乎总是事与愿违。

【讨论】:

  • 但与 JList 或 JTable 相比,滚动是不自然的,需要自定义 scrollIncrement +1
  • @mKorbel 我不同意。 JPanel 的滚动与 JTable 或 JList 中的滚动方式相同。
  • JList/JTable 与 JPanel 返回点相比重新调整行:-)
  • @mKorbel 我已经瘦了,它可以工作,就像 JList 一样。你分不出区别。
  • 没什么特别的,最好是有时间尝试和比较... :-),请在此处查看我的 (un_delete of) 帖子
【解决方案2】:

您也应该创建一个自定义列表单元编辑器,它重用来自 ListCellRenderer 的代码进行外观,但在按钮上实现动作侦听器。 单元格渲染器仅用于标记列表中的图形图像。要在 JList 中使用控件,您应该使用单元格编辑器。

【讨论】:

  • +1 用于解释渲染器,-1 用于编辑器:核心 JList 没有可编辑性的概念
【解决方案3】:
  • Renderer 只是在JList、JComboBox 或JTable 中显示和格式化JComponets,基本上所有内容都在JList 和JTable 教程中进行了描述,然后通过使用JList 你可以仅限

  • 也许我错了,但我认为最重要的是,从JList你不能返回JButtons被点击或另一个JButton's events,只能通过JList中的选择,通过这个事件确定您可以向 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相比,缺少importand方法,

  • 将JList 替换为JTable,创建不带TableHeader 且只有一个Column 的JTable

  • follows only!!! with code by @camickr,

.

.

编辑(@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;
        }
    }
}

【讨论】:

    【解决方案4】:

    @Jakub Zaverka 我同意,我已经在使用它了,而且效果很好。 @nikel 我建议您使用 GridBagLayout 和 GridBagConstraint 来管理您的组件。

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多