Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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 如何通过声明的名称引用局部变量_Java_Swing - Fatal编程技术网

Java 如何通过声明的名称引用局部变量

Java 如何通过声明的名称引用局部变量,java,swing,Java,Swing,如果我有一个按钮点击处理程序函数,我希望能够通过其引用名称(例如最小化按钮或最大化按钮)而不是通过使用: 注意:我不想将其声明为类变量 编辑:我需要在一个函数中处理按钮点击的原因是我不想重复代码(见下文)。我不想要以下内容: class Game extends JFrame { public Game() { JButton minimize_button = new JButton(); minimize_button.addMouse

如果我有一个按钮点击处理程序函数,我希望能够通过其引用名称(例如最小化按钮或最大化按钮)而不是通过使用:



注意:我不想将其声明为类变量

编辑:我需要在一个函数中处理按钮点击的原因是我不想重复代码(见下文)。我不想要以下内容:

class Game extends JFrame
{
    public Game()
    {
        JButton minimize_button = new JButton();

        minimize_button.addMouseListener(new MouseAdapter()
        {
             public void mouseClicked(MouseEvent mouse)
             {
                 int window_state = Game.this.getExtendedState();

                 if (window_state == JFrame.NORMAL || window_state == JFrame.MAXIMIZED_BOTH)
                    Game.this.setExtendedState(JFrame.ICONIFIED);
             }
        });

        JButton maximize_button = new JButton();

        maximize_button.addMouseListener(new MouseAdapter()
        {
             public void mouseClicked(MouseEvent mouse)
             {
                 int window_state = Game.this.getExtendedState();

                 if (window_state == JFrame.NORMAL)
                     window_state = JFrame.MAXIMIZED_BOTH;
                 else if (window_state == JFrame.MAXIMIZED_BOTH)
                     window_state = JFrame.NORMAL;

                 Game.this.setExtendedState(window_state);
             }
        });
    }
}



注意:请不要评论“哦,你应该这样做”。我想知道的是,我可以通过引用名引用变量吗。如果是,怎么做?上述示例中的反射将不起作用,正如我所述,我不想将它们声明为类变量。

在您的示例中,您试图访问其范围之外的最小化按钮和最大化按钮。它们不再在您声明它们的Game()构造函数之外“存在”。无法改变这一点

另一种方法是将它们声明为类变量,即属性。你已经声明你不想要这个

我能提出的使其编译的最简单的更改如下。我不建议这样做,但它在您确定的约束范围内回答了您的问题。在这里,我将最小化和最大化按钮引用传递到“共享”方法setWindowsState()


你看了吗?(1-)什么重复代码?我看到的唯一重复代码是获取/设置扩展状态。没有理由做你正在做的事情。您确实使整个过程复杂化了。最小化和最大化侦听器都包含不同的功能,不应组合到单个侦听器中。您甚至不应该在JButton上使用鼠标侦听器。您应该使用
ActionListener
@camickr,您是正确的,只修改了一个设置。然而,正如我所指出的,以上只是一个例子。每当窗口状态改变时,我都会做一些改变。关于“您应该使用…”的问题,请阅读下面的注释。@johnny,下面的注释没有任何意义。如果你问了一个问题,那么这个问题应该是有意义的,发布的代码也应该是有意义的,这样我们才能更好地理解你的问题。试图用鼠标听器来听按钮的点击,表明您不熟悉Swing。不熟悉Swing还可能表明您正在做出其他糟糕的设计决策,例如您在这里试图做的事情。还有更好的解决方案。例如,您可以创建一个自定义的
ActionListener
,它接受
布尔值
参数(我们称之为)
isMaximize
。然后创建两个
ActionListeners
,每个按钮一个,值为真/假。然后,逻辑内部是基于布尔值的,引用名称是不相关的。您不应该基于引用名称进行编码。所以你应该寻求更好的方法来解决这个问题,正如我已经明确指出的,我不想通过名字来引用一个对象。我想知道的是,我可以通过引用名引用变量吗。我的代码只是一个例子来说明我试图实现的目标。@johnny抱歉,我只是想指导您编写更健壮、可维护的代码。我已经更新了我的答案。简言之,你追求的是根本不可能的。”@adam”,不需要道歉。我怀疑这是不可能的。我想Object.setName(字符串)就可以了。
class Game extends JFrame
{
    public Game()
    {
        JButton minimize_button = new JButton();

        minimize_button.addMouseListener(new MouseAdapter()
        {
             public void mouseClicked(MouseEvent mouse)
             {
                 setWindowState(mouse); 
             }
        });

        JButton maximize_button = new JButton();

        maximize_button.addMouseListener(new MouseAdapter()
        {
             public void mouseClicked(MouseEvent mouse)
             {
                 setWindowState(mouse); 
             }
        });
    }

    private void setWindowState(MouseEvent mouse)
    {
        int window_state = Game.this.getExtendedState();

        JButton button = (JButton)mouse.getComponent();

        if (button == minimize_button)
        {
            if (window_state == JFrame.NORMAL || window_state == JFrame.MAXIMIZED_BOTH)
                window_state = JFrame.ICONIFIED;
        }
        else if (button == maximize_button)
        {
            if (window_state == JFrame.NORMAL)
                window_state = JFrame.MAXIMIZED_BOTH;
            else if (window_state == JFrame.MAXIMIZED_BOTH)
                window_state = JFrame.NORMAL;
        }

        Game.this.setExtendedState(window_state);
    }
}
class Game extends JFrame
{
    public Game()
    {
        JButton minimize_button = new JButton();

        minimize_button.addMouseListener(new MouseAdapter()
        {
             public void mouseClicked(MouseEvent mouse)
             {
                 int window_state = Game.this.getExtendedState();

                 if (window_state == JFrame.NORMAL || window_state == JFrame.MAXIMIZED_BOTH)
                    Game.this.setExtendedState(JFrame.ICONIFIED);
             }
        });

        JButton maximize_button = new JButton();

        maximize_button.addMouseListener(new MouseAdapter()
        {
             public void mouseClicked(MouseEvent mouse)
             {
                 int window_state = Game.this.getExtendedState();

                 if (window_state == JFrame.NORMAL)
                     window_state = JFrame.MAXIMIZED_BOTH;
                 else if (window_state == JFrame.MAXIMIZED_BOTH)
                     window_state = JFrame.NORMAL;

                 Game.this.setExtendedState(window_state);
             }
        });
    }
}
public Game() {
    JButton minimize_button = new JButton();
    JButton maximize_button = new JButton();

    minimize_button.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent mouse) {
            setWindowState(mouse, minimize_button, maximize_button);
        }
    });

    maximize_button.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent mouse) {
            setWindowState(mouse, minimize_button, maximize_button);
        }
    });
}

private void setWindowState(MouseEvent mouse, JComponent minimize_button, JComponent maximize_button) {
    int window_state = Game.this.getExtendedState();
    JButton button = (JButton) mouse.getComponent();

    if (button == minimize_button) {
        if (window_state == JFrame.NORMAL || window_state == JFrame.MAXIMIZED_BOTH)
            window_state = JFrame.ICONIFIED;
    } else if (button == maximize_button) {
        if (window_state == JFrame.NORMAL) {
            window_state = JFrame.MAXIMIZED_BOTH;
        } else if (window_state == JFrame.MAXIMIZED_BOTH) {
            window_state = JFrame.NORMAL;
        }
    }
    Game.this.setExtendedState(window_state);
}