2012-03-22 11 views
1

私はJavaで新しいです。Javaの複数のボタンの座標

私は鉱山を作っています。私はparamteres(x_length、y_length)でGridLayoutを使用しています。私はどのボタンを押したかを知りたいです - >彼の座標(x、y)。しかし、それをリスナーに入力するとエラーが出ます - > 'x'の修飾子をfinalに変更します。 私の質問は、単にボタンの座標を取得するだけですか?

また、ボタンのサイズを変更するにはどうすればいいですか? setSizeは私のためには機能しません。

for (int y = 0; y < y_length; y++) 
    { 
     for (int x = 0; x < x_length; x++) 
     {    
      buttons[x][y] = new JButton("X"); 

      buttons[x][y].addMouseListener(new MouseAdapter() 
      { 
       public void mouseClicked(MouseEvent e) 
       { 
        if (e.getButton() == MouseEvent.BUTTON1) 
        { 
         //exception -> Cannot refer to a non-final variable x inside an inner class defined in a different method 
         JOptionPane.showMessageDialog(null, "Left -> " + x + " | " + y); 
        } 
        else if (e.getButton() == MouseEvent.BUTTON3) 
        { 
         JOptionPane.showMessageDialog(null, "Right -> " + x + " | " + y); 
        } 
       } 
      }); 
      mines_array.add(buttons[x][y]); 
     } 
    } 
+0

1をそこに置かれています。 2)質問ごとに1つの質問をするのが最善です。 3)レイアウトマネージャーは、一般的に、サイズ以上のコンポーネントの推奨サイズを尊重します。 4)エラーメッセージと例外出力をコピーして貼り付けて、コードフォーマットを使用してください。 5)このGUIのボタンには、「ActionListener」が適している可能性があります。それは何をするためのものか? –

+0

xとyは、ループ内で常に変化するので、「最終」にすることはできません。あなたができること(しかし、醜いハックなので、答えとして入れないのです)は、ネストされたループの中に宣言を入れます: 'final int x2 = x; final int y2 = y'を参照して、リスナーの内部で 'x2'と' y2'を参照してください。 Andrewがちょうど言ったように、 'ActionListener'はより適切で、sizeの代わりにpreferredSizeを設定します。 –

答えて

2

パラメータ(xとy)が必要なため、匿名のクラスではなく、まずリスナーのカスタムクラスを作成する必要があります。

private static class ButtonMouseListener extends MouseAdapter { 
    private final int x; 
    private final int y; 

    public ButtonMouseListener(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public void mouseClicked(MouseEvent e) { 
     if (e.getButton() == MouseEvent.BUTTON1) { 
      JOptionPane.showMessageDialog(null, "Left -> " + x + " | " + y); 
     } else if (e.getButton() == MouseEvent.BUTTON3) { 
      JOptionPane.showMessageDialog(null, "Right -> " + x + " | " + y); 
     } 
    } 
} 

その後、あなたはこのようにあなたのコードを使用することができます:

すべてをだ
for (int y = 0; y < y_length; y++) { 
    for (int x = 0; x < x_length; x++) {    
     buttons[x][y] = new JButton("X"); 
     buttons[x][y].addMouseListener(new ButtonMouseListener(x, y)); 
     mines_array.add(buttons[x][y]); 
    } 
} 

は、楽しみを持っています。 ボタンのサイズについて、親コンテナでレイアウトを使用すると、そのサイズはレイアウトによって自動的に計算され、setSize()で変更することはできません。鉱山用

関連する問題