【问题标题】:Java Add Click Listener to JButton in Loop in ThreadJava在线程中的循环中将点击监听器添加到JButton
【发布时间】:2012-10-01 21:44:28
【问题描述】:

我有一个循环,其中创建了几个 JLabel,其中包含指向图像的链接。

对于每个 JLabel,都会创建一个 JButton。

我正在寻找的行为是为每个 JButton 添加一个单击侦听器,该侦听器触发一个方法。

第一个问题是我似乎无法在线程中添加监听器。

第二个问题是我看不到如何指定每个 JButton 来触发具有不同值的点击侦听器。

我正在寻找类似于以下的东西(显然 onClick 方法不存在):

Thread thread = new Thread(new Runnable()
{
    public void run()
    {
        JPanel mainPanel = new JPanel();
        for (int counter = 0; counter < imageSources.size(); counter++)
        {
            JLabel imageSource = imageSources.get(counter);
            // JButton saveToDisk = new JButton("Save Image");
            // saveToDisk.onClick(saveFavourite(imageSources.get(counter)));
            mainPanel.add(imageSource);
            // mainPanel.add(saveToDisk);
        }

.
.
.

public void saveFavourite(String imageUrl)
{
    BufferedImage image = null;
    try
    {
        URL url = new URL(imageUrl);
        image = ImageIO.read(url);
        ImageIO.write(image, "jpg", new File("/Users/USERNAME/Desktop/" + webPage.getMemeId(imageUrl) + ".jpg"));
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}

【问题讨论】:

  • 这让我很困惑:"The behaviour I'm looking for is that for each JButton, to add a click listener, which fires a method." -- 你能更详细地解释一下这意味着什么以及你想要做什么。
  • 在一个循环中,我正在创建几个 JButton,我希望每个 JButton 都有一个点击监听器,它执行一个方法。
  • 另外,您是否尝试从 EDT(Swing 事件调度线程)创建和添加 Swing 组件?如果是这样,请不要。
  • JButton 使用 ActionListeners 而不是“点击监听器”。如果您将 ActionListener 添加到按钮,或设置其 Action,那么这应该会为您处理好事情。
  • 您需要创建一个实现 ActionListener 或扩展 AbstractAction 的类,为该类提供一个构造函数,该构造函数接受您感兴趣的字符串(或任何其他需要传入的信息),然后添加将 JButton 作为其 ActionListener 或作为其 Action。

标签: java swing jpanel jlabel bufferedimage


【解决方案1】:

这是一个创建按钮并向其添加在循环期间采用字符串参数的 ActionListener 的简单示例

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test extends JFrame {

    private final JLabel[] label = new JLabel[5];
    private final JButton[] button = new JButton[5];

    public Test() {
        JPanel mainPanel = new JPanel(new GridLayout(0,2));
        for (int counter = 0; counter < label.length; counter++) {
            label[counter] = new JLabel("Label " + counter);
            button[counter] = new JButton("Button " + counter);
            button[counter].addActionListener(new MyActionListener("Row " + counter));
            mainPanel.add(label[counter]);
            mainPanel.add(button[counter]);
        }
        this.add(mainPanel);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Test run = new Test();
                run.pack();
                run.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                run.setVisible(true);
            }
        });
    }

    private class MyActionListener implements ActionListener {

        String text;

        public MyActionListener(String text) {
            this.text = text;
        }

        public void actionPerformed(ActionEvent e) {
            System.out.println(text);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 2017-01-11
    • 2018-02-11
    • 2016-12-07
    相关资源
    最近更新 更多