【问题标题】:Java interface programmingJava接口编程
【发布时间】:2016-04-14 23:40:17
【问题描述】:

按钮事件有问题。当我按下任何btn_ij 时,我想更改我的数组 (dizi[i][j])。按钮适用于更改背景颜色,但不适用于更改数组(例如 dizi[i][j]=2;)。我该如何解决这个问题?

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();
}
}

【问题讨论】:

  • 我想改变我的数组”和你的标题有什么关系?
  • 因为我正在制作java接口程序,我在使用ActionListener时遇到了问题。
  • “接口编程”没有描述您面临的问题。当您询问做某事所需的鸡蛋数量时,这就像在说“烹饪”。请编辑您的标题并使其更具描述性,以便遇到相同问题的人能够识别/找到您的帖子。
  • 您没有设置默认关闭操作,因此当您在数独程序中按 x 时,它会在没有 GUI 的情况下继续运行。要使其关闭,请执行以下操作: setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);在数独构造函数中。
  • 请注意:您的缩进高度不一致。请为我们和您自己解决这个问题。到处都是缩进的代码很难阅读,而且很容易相信代码属于不同的块而不是它实际属于的块。

标签: java arrays events button interface


【解决方案1】:

你有一个明显的错误是ij 是可变字段。您在循环时不断更改它们,这样一旦您的循环完成,它们都将是4,这是循环停止的时间。这意味着你所有的动作监听器都会触发一个 ArrayIndexOutOfBoundException 4 is out of bounds 或类似的东西。

我建议;

  • 收到错误消息后请务必阅读。它通常会提示您问题所在。如果您不理解,请将其包含在他的问题中。
  • 诊断和检查此问题的最简单方法是在调试器中调试程序。
  • 不要将字段用于循环变量。
  • 获取ifinal int finalI = i; 副本并在您的匿名内部类中使用它。注意:你的 IDE 应该有一个自动修复

【讨论】:

  • final int finalI = i;这对我很有用,非常感谢
【解决方案2】:

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;
                }
            }
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-02
    • 2017-08-21
    • 1970-01-01
    • 2011-07-02
    • 2013-04-22
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    相关资源
    最近更新 更多