2016-12-03 12 views
0

jbuttonの行と列があり、各ボタンをクリックすると赤くなり、もう一度クリックすると元の色に戻ります。これまでのところ、私が書いたコードは次のとおりです。アクションリスナー

public class MainPanel extends JPanel 
{ 

    private JButton[][] btn1 = new JButton[3][5]; 

    public MainPanel() 
    { 
     JPanel MainPanel= new JPanel(); 
     MainPanel.setPreferredSize(new Dimension(700,700)); 

     JPanel p1 = new JPanel(); 
     { 
      p1.setLayout(new GridLayout(3,5,10,10)); 
      p1.setBackground(Color.WHITE); 
      for(int i = 0; i < 3; i++) 
       for(int j = 0; j < 5; j++) 
       { 
        btn1[i][j] = new JButton(); 
        btn1[i][j].setBackground(Color.YELLOW); 
        p1.add(btn1[i][j]); 

        btn1[i][j].addActionListener 
        (
         new ActionListener() 
         { 
          public void actionPerformed(ActionEvent e) 
          { 
           btn1[i][j].setBackground(Color.RED); 
          } 
         } 
        ); 
       } 
     } 
    } 
} 

ラインbtn1[i][j].setBackground(Color.RED);は「内部クラスから参照ローカル変数は、最終的または効果的に最終でなければならない」述べています。誰もがこれを修正する方法を知っていますか?

答えて

0

は、ループ内でリスナーを追加します。

for(int i = 0; i < 3; i++) 
    for(int j = 0; j < 5; j++) { 
     final JButton btn = btn1[i][j]; 
     btn1[i][j].addActionListener(
      new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        btn.setBackground(Color.RED); 
       } 
      } 
     ); 
    } 

あなただけの最初のボタンにリスナーを追加しました。

+0

forループ内に配置すると、その行にフラグが立てられます。 btn1 [i] [j] .setBackground(Color.RED); '内部クラスから参照されるローカル変数はfinalまたは実質的にfinalでなければならず、動作しません。 – May

+0

finalとしてbtn1変数を定義します。 –

+0

@pacoパネルp1はメインパネルの内側にあります。メインパネルでは、ここでbtn1変数を宣言しました。編集したビューの質問を参照してください。ラインbtn1 [i] [j] .setBackground(Color.RED);まだ動作していません。 – May

関連する問題