JButton没有响应Click事件

时间:2012-03-27 09:25:16

标签: java swing jbutton jlist

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

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

由于

4 个答案:

答案 0 :(得分:2)

为什么要使用JList,渲染器和编辑器遇到这么多麻烦,只需创建一个带有框布局的JPanel,将所有标签和按钮放在里面,然后在滚动窗格中显示该面板。代码很短,不会有任何行为上的麻烦。

一般来说,放置其他组件是JTable和JList等组件几乎总是比它的价值更麻烦。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

  • Renderer即将在JComponetsJListJComboBox内展示JTable,基本上所有内容都在JList中描述, JTable教程,然后使用JList,您只能

enter image description here enter image description here enter image description here

  • 也许我错了,但我认为没有别的,只有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

  • follows only!!! with code by @camickr

编辑(@Jakub Zaverka)

enter image description here

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来管理你的组件。