2016-01-10 2 views
-1

У меня проблема с событием кнопки. Я хочу изменить свой массив (dizi[i][j]), когда я нажимаю btn_ij. Кнопки хорошо работают для изменения цвета фона, но не работают для изменения массива (пример dizi[i][j]=2;). Как я могу это исправить?Программирование интерфейса Java

package renksudokusu; 

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class Sudoku extends JFrame { 

public int[][] dizi = 
     {{1,2,1,1}, 
     {1,1,1,1}, 
     {1,1,1,1}, 
     {1,1,1,1}}; 
public int i,j; 

public Sudoku(){ 

    this.setTitle("asdf"); 
    this.setSize(600,430); 
    this.setVisible(true); 
    this.setLayout(null); 
    this.setResizable(false); 

    for(i=0;i<4;i++){ 
     for(j=0;j<4;j++){ 
      JButton btn_ij=new JButton(); 
      btn_ij.setBackground(Color.RED); 
      this.add(btn_ij); 
      btn_ij.setBounds(i*100,j*100,100,100); 

      btn_ij.addActionListener(new ActionListener(){ 
       public void actionPerformed(ActionEvent arg0){ 
       if(btn_ij.getBackground()==Color.RED){ 
        btn_ij.setBackground(Color.BLUE); 
        dizi[i][j]=2; 
       } 

       else if(btn_ij.getBackground()==Color.BLUE){ 
        btn_ij.setBackground(Color.GREEN); 
        dizi[i][j]=3; 
       } 

       else if(btn_ij.getBackground()==Color.GREEN){ 
        btn_ij.setBackground(Color.YELLOW); 
        dizi[i][j]=5; 
       } 

       else if(btn_ij.getBackground()==Color.YELLOW){ 
        btn_ij.setBackground(Color.RED); 
        dizi[i][j]=1; 
       } 
     } 
      }); 
     } 
    }// For döngülerinin bitişi. 

    JButton basla=new JButton("Başla"); 
    this.add(basla); 
    basla.setBounds(450,10,100,50); 

    JButton kontrol=new JButton("Kontrol Et"); 
    this.add(kontrol); 
    kontrol.setBounds(450,80,100,50); 
    kontrol.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent arg0){ 
      for(int i=0;i<4;i++){ 
       for(int j=0;j<4;j++){ 

       } 
      } 
} 
    });  

    JButton cikis=new JButton("Çıkış"); 
    this.add(cikis); 
    cikis.setBounds(450,150,100,50); 
    cikis.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent arg0){ 
      System.exit(0); 
} 
    }); 

} 

public static void main(String[] args) { 
    new Sudoku(); 
} 
} 
+0

Как «* я хочу изменить свой массив *», связанный с вашим названием? – Pshemo

+0

потому что я делаю программу интерфейса Java, и у меня проблема, когда я использую ActionListener. –

+0

«Программирование интерфейса» не описывает проблему, с которой вы сталкиваетесь. Это как сказать «приготовление пищи», когда вы спрашиваете о количестве яиц, которые нужно сделать * что-то *. Пожалуйста, отредактируйте свое название и сделайте его более наглядным, чтобы люди, столкнувшиеся с одной и той же проблемой, могли узнать/найти ваше сообщение. – Pshemo

ответ

3

Очевидная ошибка у вас есть то, что i и j являются изменяемыми полями. Вы продолжаете менять их, когда вы зацикливаетесь так, что как только ваши петли закончены, они оба будут 4, когда цикл останавливается. Это означает, что все ваши действия, выполняющие прослушивание, вызовут ArrayIndexOutOfBoundException 4 вне границ или что-то в этом роде.

Предлагаю;

  • всегда читает сообщение об ошибке, когда вы его получите. Обычно это дает вам подсказку относительно проблемы. Если вы этого не понимаете, включите его в вопрос.
  • Самый простой способ диагностики и проверки этого - отладить вашу программу в отладчике.
  • не используют поля для переменных цикла.
  • возьмите final int finalI = i; копию i и используйте это внутри анонимного внутреннего класса. Примечание: ваша IDE должна иметь autofix для этого
+0

final int finalI = i; это сработало для меня очень хорошо, спасибо вам большое <3 –

1

i и j перейти к 4, чтобы вы получили исключение из диапазона. Попробуйте вот так:

 btn_ij.addActionListener(new ActionListener() { 

      int my_i = i; 
      int my_j = j; 

      public void actionPerformed(ActionEvent arg0) { 
       if (btn_ij.getBackground() == Color.RED) { 
        btn_ij.setBackground(Color.BLUE); 
        System.out.println(my_i); 
        System.out.println(my_j); 
        dizi[my_i][my_j] = 2; 
       } 

       else if (btn_ij.getBackground() == Color.BLUE) { 
        btn_ij.setBackground(Color.GREEN); 
        dizi[my_i][my_j] = 3; 
       } 

       else if (btn_ij.getBackground() == Color.GREEN) { 
        btn_ij.setBackground(Color.YELLOW); 
        dizi[my_i][my_j] = 5; 
       } 

       else if (btn_ij.getBackground() == Color.YELLOW) { 
        btn_ij.setBackground(Color.RED); 
        dizi[my_i][my_j] = 1; 
       } 
      } 
     }); 
Смежные вопросы