2017-07-15 5 views
1

現在、3x3ボタン付きのTic Tac Toe GUIグリッドを設定しようとしています。Java:内部メソッド中にオブジェクト参照を見つける

私はJButtonの配列を設定し、ボタンが押されるたびにチェックするリスナーを追加しました。

私の問題は配列内のButtonオブジェクトにアクセスしているため、ボタンリスナーの参照を保存するためにカスタムリスナーコンストラクタにパラメータを追加する必要がありました。それはそのままでは動作しますが、非常にエレガントではありません。 actionPerformedの中にボタンで正しいJButtonオブジェクトを見つける方法はありますか?これを行うには良い方法がありますか?事前に

おかげ

class BigPanel 
{ 
    public JPanel bigPanel= new JPanel(new GridLayout(3,3)); 
    public JButton[][] buttons = new JButton[3][3]; 

    public BigPanel() 
    { 
     for (int i=0; i<3; i++) 
     { 
      for (int j=0; j<3; j++) 
      { 
       buttons[i][j] = new JButton(); 
       buttons[i][j].setPreferredSize(new Dimension(75,75)); 

       // Line of interest, adding the listener 
       buttons[i][j].addActionListener(new CustomActionListener(buttons[i][j])); 

       bigPanel.add(buttons[i][j]); 
      } 
     } 
    } 
} 

class CustomActionListener implements ActionListener 
{ 
    public int a; 
    public int b; 
    public JButton button; 

    CustomActionListener(JButton a) 
    { 
     button = a; 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     changeButton(a, b, CurrPlayer.CROSSES); 
    } 

    public void changeButton(int a, int b, CurrPlayer player) 
    { 
     if (player == CurrPlayer.NOUGHTS) 
     { 
      Icon icon = new ImageIcon("Nought.jpg"); 
      button.setIcon(icon); 
     } 
     else 
     { 
      Icon icon = new ImageIcon("Cross.jpg"); 
      button.setIcon(icon); 
     } 
    } 
} 
+0

リスナーがどのように動作するかはわかりません。ボタンのx座標とy座標は決して設定されません。 –

+0

申し訳ありませんが、あなたは何を意味するのか分かりません、あなたは説明できますか?私はこれまで押されていたときにボタンイメージを変更するリスナーを得ることができました。 –

答えて

0
を次のようにあなたの CustomActionListenerを変更

あなたはactionEvent.getSource()メソッドを使用してJButton参照を取得することができます

class CustomActionListener implements ActionListener { 
    public int a; 
    public int b; 

    CustomActionListener() 
    { 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     JButton button = (JButton) e.getSource(); 
     changeButton(a, b, CurrPlayer.CROSSES, button); 
    } 

    public void changeButton(int a, int b, CurrPlayer player, JButton button) 
    { 
     if (player == CurrPlayer.NOUGHTS) 
     { 
      Icon icon = new ImageIcon("Nought.jpg"); 
      button.setIcon(icon); 
     } 
     else 
     { 
      Icon icon = new ImageIcon("Cross.jpg"); 
      button.setIcon(icon); 
     } 
    } 
} 

この問題を解決します。

そして

buttons[i][j].addActionListener(new CustomActionListener()); 

次のようにボタンにアクションリスナーを追加しますが、これはあなたをお手伝いします願っています。

+0

ありがとう、それはまさに私が探していたものだった –

+0

それは働いた?????? – ELITE

+0

ええ、それは完全に機能しましたが、今度は、セルが獲得されたらイメージを変更できるように、操作からbigPanelにアクセスする方法を理解する必要があります。 –

関連する問題