2017-01-02 7 views
-1

내 actionPerformed 메소드에 문제가 있습니다. 버튼을 누를 때마다 버튼 이미지를 변경하고 싶습니다. 나는 하나의 버튼 (예를 들어 button[0][0]) 작동이 작업을 수행하지만, 모든 나는배열을 사용하여 버튼을 눌렀을 때 JButton 이미지 변경

java.lang.ArrayIndexOutOfBoundsException을 얻을 경우

내가 여기에 붙어있어 나는 방법을 모른다 문제를 해결하려면 ...

public class ExButtons { 


JButton[][] button = new JButton[4][5]; 
ImageIcon[][] img = new ImageIcon[4][5]; 
ImageIcon cardTurned = new ImageIcon(); 

private final JPanel panel = new JPanel(); 
private final JFrame frame = new JFrame(); 
private int i, j; 

public ExButtons() { 

    img[0][0] = new ImageIcon("..."); 
    img[0][1] = new ImageIcon("..."); 
    img[0][2] = new ImageIcon("..."); 
    img[0][3] = new ImageIcon("..."); 
    img[0][4] = new ImageIcon("..."); 
    img[1][0] = new ImageIcon("..."); 
    img[1][1] = new ImageIcon("..."); 
    img[1][2] = new ImageIcon("..."); 
    img[1][3] = new ImageIcon("..."); 
    img[1][4] = new ImageIcon("..."); 
    img[2][0] = new ImageIcon("..."); 
    img[2][1] = new ImageIcon("..."); 
    img[2][2] = new ImageIcon("..."); 
    img[2][3] = new ImageIcon("..."); 
    img[2][4] = new ImageIcon("..."); 
    img[3][0] = new ImageIcon("..."); 
    img[3][1] = new ImageIcon("..."); 
    img[3][2] = new ImageIcon("..."); 
    img[3][3] = new ImageIcon("..."); 
    img[3][4] = new ImageIcon("..."); 
    cardTurned = new ImageIcon("..."); 

    for (i = 0; i < button.length; i++) { 
     for (j = 0; j < button[0].length; j++) { 
      button[i][j] = new JButton(img[i][j]); 

     } 
    } 

    int x = 100, y = 100; 

    for (i = 0; i < button.length; i++) { 
     for (j = 0; j < button[0].length; j++) { 

      button[i][j].setBounds(x, y, 60, 60); 
      panel.add(button[i][j]); 

      x += 80; 

      if (j == 4) { 

       x = 100; 
       y += 80; 
      } 
     } 
    } 

    for (i = 0; i < button.length; i++) { 
     for (j = 0; j < button[0].length; j++) { 

      button[i][j].addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 

        System.out.println("Button[" + i + "][" + j + "] was pressed"); 
        button[i][j].setIcon(button[i][j].getIcon() == img[i][j] ? cardTurned : img[i][j]); 

       } 
      }); 
     } 
    } 

    frame.setSize(600, 600); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    panel.setLayout(null); 
    for (i = 0; i < button.length; i++) { 
     for (j = 0; j < button[0].length; j++) { 
      panel.add(button[i][j]); 
     } 
    } 

    frame.add(panel); 
    frame.setVisible(true); 

} 

public static void main(String[] args) { 
    new ExButtons().frame.setVisible(true); 
} 
} 

답변

1

루프의 끝에서 i와 j는 모두 경계를 벗어났습니다. 따라서 모든 청취자는 i와 j에 대해 이러한 바운드 값을 사용합니다.

i 및 j는 필드가 아니어야합니다. 로컬 변수 여야합니다. 당신은 또한 확실히 버튼의 경계를 설정하는 생각을 포기해야

for (int i = 0; i < button.length; i++) { 
    for (int j = 0; j < button[0].length; j++) { 

     final JButton btn = button[i][j]; 
     final ImageIcon image = img[i][j]; 

     btn.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 

       btn.setIcon(btn.getIcon() == image ? cardTurned : image); 

      } 
     }); 
    } 
} 

:

for (int i = 0; i < button.length; i++) { 
    for (int j = 0; j < button[0].length; j++) { 

     final int i2 = i; 
     final int j2 = j; 

     button[i][j].addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 

       System.out.println("Button[" + i2 + "][" + j2 + "] was pressed"); 
       button[i2][j2].setIcon(button[i2][j2].getIcon() == img[i2][j2] ? cardTurned : img[i2][j2]); 

      } 
     }); 
    } 
} 

또는 간단 : 청취자가 최종 변수를 필요로하기 때문에, 당신은 이러한 변수의 최종 사본이 필요합니다. 대신 레이아웃 관리자를 사용하십시오. 그게 그 직업입니다.

+0

감사합니다. @JB Nizet! – Nico