【问题标题】:Java simplifying a repetitive code snippet to a function within ActionListenerJava 将重复的代码片段简化为 ActionListener 中的函数
【发布时间】:2021-07-19 10:16:00
【问题描述】:

我想知道什么是简化以下 sn-p 代码的优雅而有效的方法。由于我有更多按钮,并且它们的机制都以相同的方式运行,因此方法的对称性以及与 color.green -> color.red 的交替表明可能存在一种将其简化为函数的方法?

我一直在为这个设计问题摸不着头脑,我编写它的方式似乎肯定是错误和麻烦的。

GameFrame 类

public class GameFrame extends JFrame{

// (...)
static void initializeComponents(GameFrame frame, GamePanel GamePanel) {

// (...)
ArrayList<JGradientButton> buttons = new ArrayList<JGradientButton>();
Collections.addAll(buttons, b1,b2,b3,b4,b5);
for(JGradientButton button : buttons) {
            button.addActionListener(new ActionListener() {
                
                @Override
                public void actionPerformed(ActionEvent e) {
                    if(button == b1) {
                        GamePanel.b1Pressed();
                        
                    } else if (button == b2) {
                        GamePanel.b2Pressed();

                        if(GamePanel.removeFlag) {
                            button.color = Color.green;
                        } else {
                            button.color = Color.red;
                        }
                        button.repaint();
                        
                    } else if (button == b3) {
                        GamePanel.b3Pressed();  

                        if(!GamePanel.collisionFlag) {
                            button.color = Color.green;
                        } else {
                            button.color = Color.red;
                        }
                        button.repaint();
                     } else if (button == b4) {
                        GamePanel.b4Pressed();
                        if(!GamePanel.electricFlag) {
                            button.color = Color.green;
                        } else {
                            button.color = Color.red;
                        }
                        button.repaint();
                
                     } else {
                        GamePanel.b5Pressed();
                        if(!GamePanel.gravityFlag) {
                            button.color = Color.green;
                        } else {
                            button.color = Color.red;
                        }
                        button.repaint();
                     }
                } 
            });
        }
// (...)

}

我对上述方法不满意,因为我有很多按钮,而且它们交替的代码很容易占用大约 100 行代码。交替的对称性向我表明,这种设计可能存在更好的方法。

我曾尝试编写一个采用buttons 列表的函数,但我们用actionPerformed 覆盖这一事实让我很困惑,我不知道是否真的存在简化这一点的方法。

【问题讨论】:

    标签: java design-patterns simplification


    【解决方案1】:

    您可以通过多种方式执行此操作,但其中一种可能是获取您需要的公共状态信息并将其应用于方法,例如...

    protected void update(JGradientButton button, boolean state, Color trueState, Color falseState) {
        if (state) {
            button.color = trueState;
        } else {
            button.color = falseState;
        }
        button.repaint();
    }
    

    然后你可以用类似...的东西来调用它

    for (JGradientButton button : buttons) {
        button.addActionListener(new ActionListener() {
    
            @Override
            public void actionPerformed(ActionEvent e) {
                if (button == b1) {
                    GamePanel.b1Pressed();
                } else if (button == b2) {
                    GamePanel.b2Pressed();
                    update(button, GamePanel.removeFlag, Color.green, Color.red);
                } else if (button == b3) {
                    GamePanel.b3Pressed();
                    update(button, GamePanel.collisionFlag, Color.green, Color.red);
                } else if (button == b4) {
                    GamePanel.b4Pressed();
                    update(button, GamePanel.electricFlag, Color.green, Color.red);
                } else {
                    GamePanel.b5Pressed();
                    update(button, GamePanel.gravityFlag, Color.green, Color.red);
                }
            }
        });
    

    我可能还会考虑查看 bXPressed 正在做什么以及它可能能够做什么以及是否可以将功能交给他们。

    你也可以使用the Action API,但问题是,你在看哪个标志?这将需要某种委托查找来确定状态,因此您最终会与上述情况相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      相关资源
      最近更新 更多