我正在开发一个GUI卡片游戏,我想知道是否有一种方法可以改进我的代码。这是我的情况。
我有三张卡: A、B和C。玩家可以通过点击三个按钮中的一个来替换卡: button1、button2或button3。
class rpbtn implements ActionListener {
public void actionPerformed(ActionEvent e) {
Image1 = new ImageIcon(myDeck.myDeck[5].filename);
label_Image1.setIcon(Image1);
}
}变量名是固定的。然而,我不想通过将变量名从1更改为2或3来创建3个类似的内部类。有什么方法可以重用/改进这些代码吗?
谢谢。
发布于 2019-11-16 05:25:03
记住,您可以在内部类中使用构造函数、setter等。因此,如果actionPerformer的代码是相同的,但只更改受影响的元素,那么您可以有一个唯一的内部类,其内部有一个参数来执行操作。就像这样:
private class MyListener implements ActionListener {
Object obj;
private MyListener(Object obj) {
this.obj = obj;
}
@Override
public void actionPerformed(ActionEvent ev) {
//Operations on obj
}
}您可以使用这个JFrame示例来测试它(只需实例化它):
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实例作为匿名:
button1.addActionListener(new MyListener(label1));希望这能帮助你适应你的特殊需求。
发布于 2019-11-16 04:45:10
如果我正确理解,您正在尝试更改标签图标点击按钮。只需将ImageIcon作为构造函数参数传递并使用它。
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);
}
}https://stackoverflow.com/questions/58887402
复制相似问题