Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java将重复代码片段简化为ActionListener中的函数_Java_Design Patterns_Simplification - Fatal编程技术网

Java将重复代码片段简化为ActionListener中的函数

Java将重复代码片段简化为ActionListener中的函数,java,design-patterns,simplification,Java,Design Patterns,Simplification,我想知道简化以下代码片段的优雅而有效的方法是什么。因为我有更多的按钮,它们的机制都以相同的方式运行,所以方法的对称性,以及从color.green->color.red的交替,表明可能存在一种将其简化为函数的方法 我已经为这个设计问题挠头有一段时间了,我编写它的方式似乎肯定是错误和麻烦的 游戏框架类 公共类游戏框架扩展了JFrame{ // (...) 静态无效初始化组件(游戏框架框架、游戏面板游戏面板){ // (...) ArrayList按钮=新建ArrayList(); 集合.addAl

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

我已经为这个设计问题挠头有一段时间了,我编写它的方式似乎肯定是错误和麻烦的

游戏框架类
公共类游戏框架扩展了JFrame{
// (...)
静态无效初始化组件(游戏框架框架、游戏面板游戏面板){
// (...)
ArrayList按钮=新建ArrayList();
集合.addAll(按钮b1、b2、b3、b4、b5);
用于(JGradientButton按钮:按钮){
addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
如果(按钮==b1){
GamePanel.b1按下();
}否则如果(按钮==b2){
GamePanel.b2按下();
如果(GamePanel.removeFlag){
button.color=color.green;
}否则{
button.color=color.red;
}
按钮。重新绘制();
}否则如果(按钮==b3){
GamePanel.b3Pressed();
如果(!GamePanel.collisionFlag){
button.color=color.green;
}否则{
button.color=color.red;
}
按钮。重新绘制();
}否则如果(按钮==b4){
GamePanel.b4按下();
如果(!GamePanel.electricFlag){
button.color=color.green;
}否则{
button.color=color.red;
}
按钮。重新绘制();
}否则{
GamePanel.b5按下();
如果(!GamePanel.gravityFlag){
button.color=color.green;
}否则{
button.color=color.red;
}
按钮。重新绘制();
}
} 
});
}
// (...)
}

我对上述方法不满意,因为我有许多按钮,它们的交替代码很容易占据约100行代码。交替的对称性向我暗示,可能存在一种更好的设计方法


我曾经尝试过编写一个函数,该函数使用
按钮列表,但是我们正在使用
actionPerformed
覆盖这一事实让我很困惑,我不知道是否真的存在一种方法来简化它。

有很多方法可以实现这一点,但其中一种可能是获取所需的公共状态信息并应用将其转换为一种方法,例如

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);
            }
        }
    });

我也可以考虑看<代码> BXPress < /COD>正在做什么以及它可以做些什么,如果功能可以被移交给它们。


您也可以使用,但问题是,您正在查看哪个标志?这需要某种类型的委托查找来确定状态,因此您可能会在与上面相同的位置结束此操作。

您可以使用多种方法来完成此操作,但其中之一可能是获取所需的公共状态信息并将其应用于例如,一种方法

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);
            }
        }
    });

我也可以考虑看<代码> BXPress < /COD>正在做什么以及它可以做些什么,如果功能可以被移交给它们。


您也可以使用,但问题是,您正在查看哪个标志?这将需要某种形式的委派查找来确定状态,因此您最终会在与上述内容相同的位置。

正是我要找的,干杯!正是我要找的,干杯!