首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重用ActionListener

重用ActionListener
EN

Stack Overflow用户
提问于 2019-11-16 03:53:02
回答 2查看 114关注 0票数 0

我正在开发一个GUI卡片游戏,我想知道是否有一种方法可以改进我的代码。这是我的情况。

我有三张卡: A、B和C。玩家可以通过点击三个按钮中的一个来替换卡: button1、button2或button3。

代码语言:javascript
复制
class rpbtn implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        Image1 = new ImageIcon(myDeck.myDeck[5].filename);
        label_Image1.setIcon(Image1);
    }
}

变量名是固定的。然而,我不想通过将变量名从1更改为2或3来创建3个类似的内部类。有什么方法可以重用/改进这些代码吗?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-16 05:25:03

记住,您可以在内部类中使用构造函数、setter等。因此,如果actionPerformer的代码是相同的,但只更改受影响的元素,那么您可以有一个唯一的内部类,其内部有一个参数来执行操作。就像这样:

代码语言:javascript
复制
private class MyListener implements ActionListener {

    Object obj;

    private MyListener(Object obj) {
        this.obj = obj;
    }

    @Override
    public void actionPerformed(ActionEvent ev) {
        //Operations on obj
    }

}

您可以使用这个JFrame示例来测试它(只需实例化它):

代码语言:javascript
复制
package tests;

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;


public class MainWindow extends JFrame {

    public MainWindow() {

        JButton button1 = new JButton("Button 1");
        JButton button2 = new JButton("Button 2");
        JLabel label1 = new JLabel("Label 1");
        JLabel label2 = new JLabel("Label 2");

        MyListener ml1 = new MyListener(label1);
        MyListener ml2 = new MyListener(label2);

        button1.addActionListener(ml1);
        button2.addActionListener(ml2);

        getContentPane().setLayout(new GridLayout(0, 1));

        getContentPane().add(label1);
        getContentPane().add(label2);
        getContentPane().add(button1);
        getContentPane().add(button2);

        pack();
        setLocation(600, 300);
        setVisible(true);

    }

    private class MyListener implements ActionListener {

        JLabel label;

        private MyListener(JLabel label) {
            this.label = label;
        }

        @Override
        public void actionPerformed(ActionEvent ev) {
            label.setVisible(!label.isVisible());
        }

    }

}

即使您希望代码更紧凑,也可以使用MyListener实例作为匿名:

代码语言:javascript
复制
button1.addActionListener(new MyListener(label1));

希望这能帮助你适应你的特殊需求。

票数 1
EN

Stack Overflow用户

发布于 2019-11-16 04:45:10

如果我正确理解,您正在尝试更改标签图标点击按钮。只需将ImageIcon作为构造函数参数传递并使用它。

代码语言:javascript
复制
    class rpbtn implements ActionListener {
    ImageIcon img = null;
    public rpbtn(ImageIcon img){
        this.img = img;
    }
    public void actionPerformed(ActionEvent e) {
        //Image1 = new ImageIcon(myDeck.myDeck[5].filename);
        label_Image1.setIcon(this.img);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58887402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档