2016-11-28 17 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); 
    } 
} 


注:私はクラス変数として宣言する必要はありません

編集:なぜ私はコードを複製したくないので(下記参照)、1つの関数でボタンのクリックを処理する必要があるのです。私は次のことをしたくない:

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、あなたは正しいですが、1つの設定だけが変更されています。しかし、私が指摘したように、上記は一例にすぎません。ウィンドウの状態が変更されるたびにいくつか変更が加えられます。 「あなたは...を使用しているはずです」に関しては、下をお読みください。 – 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

関連する問題