2016-11-28 57 views
-1

如果我有按钮单击处理函数,我希望能够通过使用以下参数识别哪个按钮被其引用名称(例如minimize_button或maximize_button)和NOT单击:
如何通过声明名称引用局部变量

minimize_button.setName("minimize_button"); 


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



注:好心从评论:“哦,你应该这样做这样”不要。我想知道的是,我可以通过它的参考名称引用一个变量。如果是这样,怎么样?在上面的例子中反射将不起作用,正如我所说的,我不想将它们声明为类变量。

+0

你看过https://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html吗? – randominstanceOfLivingThing

+0

(1-)重复的代码是什么?我看到的唯一重复代码是获取/设置扩展状态。没有理由去做你正在做的事情。你真的使整个过程变得复杂。最小化和最大化侦听器都包含不同的功能,不应该被组合成一个单一的侦听器。你甚至不应该在JButton上使用MouseListener。你应该使用'ActionListener'。 – camickr

+0

@camickr,你是正确的,只有一个设置被修改。然而,正如我已经指出的那样,以上只是一个例子。每当窗口状态发生变化时,都会进行一些更改。关于“您应该使用....”,请阅读底部注意。 – johnny

回答

0

在你的例子中,你试图访问范围之外的minimize_button和maximize_button。他们停止在你已经声明的Game()构造函数之外“存在”。没有办法改变它。

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

我可以建议让它编译的最小变化如下。我不会推荐这个,但它会在你确定的约束范围内回答你的问题。在这里,我已经通过最小化并最大化按钮引用到您的“共享”方法setWindowState()中。

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

正如我已经明确指出的,我不想按名称引用对象。我想知道的是我可以通过其引用名称引用一个变量。我的代码只是一个例子来说明我想要达到的目标。 – johnny

+0

@johnny道歉,我只是试图引导你写更强大,可维护的代码。我已经更新了我的答案。总之,你所追求的是不可能的。 – Adam

+0

“@adam”,不需要道歉。我怀疑这是不可能的。我猜Object.setName(String)将不得不做。 – johnny