无法使用其他类正确访问数组

时间:2013-11-28 15:31:42

标签: java arrays

我正在尝试获取在我的班级 LightsOutPuzzle 中初始化的 outputArray 的值,解决。但是在打印了数组的元素之后

1)在 LightsOutPuzzle 中调用类解决之前  2)在调用solve之后,元素不相等,就好像它已经被重新初始化一样。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.StringTokenizer;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class LightsOutPuzzle extends JFrame implements ActionListener {

    public JFrame f;
    public JPanel p1;
    public JPanel p2;
    public JButton[] buttonArray;
    public JButton solve;
    public int nRows = 5;
    public int nColumns = 5;
    public int nTotalButtons = nRows * nColumns;
    public int[] outputArray = new int[25];

    public void create() {
        init();
        gui();
    }

    public void gui() {
        f = new JFrame("Lights Out Puzzle");
        f.setVisible(true);
        f.setSize(500,500);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        p2 = new JPanel();

        solve = new JButton("Solve");

        p2.add(solve);

        f.add(p1);
        f.add(p2, BorderLayout.SOUTH);

        solve.addActionListener(new Action());
    }

    public void init() {    
        p1 = new JPanel();
        p1.setLayout(new GridLayout(nRows, nColumns, 0, 0));

        int[] inputArray = new int[25];
        int i=0;

        buttonArray = new JButton[nTotalButtons];
        for (int nNum = 0; nNum < nTotalButtons; nNum++) 
        {
            buttonArray[nNum] = new JButton("");
            add(buttonArray[nNum]);
            //clickability
            buttonArray[nNum].addActionListener(this);
            buttonArray[nNum].setBackground(Color.yellow);
            buttonArray[nNum].setActionCommand("" + nNum);
        }

        //reading config file
        BufferedReader br = null;
        try {
            String line;
            br = new BufferedReader(new FileReader("input.txt"));

            while ((line = br.readLine()) != null) {
               StringTokenizer stringTokenizer = new StringTokenizer(line, " ");
               while (stringTokenizer.hasMoreElements()) {
                    inputArray[i] = Integer.parseInt(stringTokenizer.nextElement().toString());
                    i++;
               }
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null)
                    br.close();

            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        //drawing text input
        for(i=0; i<nTotalButtons; i++){
            if(inputArray[i] == 1)
                buttonArray[i].setBackground(Color.white);
            p1.add(buttonArray[i]);
        }
    }

    public void save() {
        int i = 0;      
        for (i=0; i<25; i++) {
            if(buttonArray[i].getBackground() == Color.yellow)
                outputArray[i] = 1;
            else 
                outputArray[i] = 0;
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) 
    {
        //conditions for the puzzle
    }

    public class Action implements ActionListener {
        public void actionPerformed (ActionEvent e) {
            int i;

            save();
            for(i=0; i<25; i++)
                System.out.println(outputArray[i]);
            new solve();
        }
    }

    public static void main(String[] args) {
        LightsOutPuzzle lop = new LightsOutPuzzle();
        lop.create();
    }
}

此时, outputArray 的所有元素都等于1.但是,当我使用其他类打印它们时, outputArray 的所有元素都是现在等于0。

import java.awt.*; 
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;

public class solve extends LightsOutPuzzle {
private JFrame f;
private JPanel p1;

int[] inputArray = new int[25];
int[] zeroArray = new int[25];
int[] UIState = new int[25];
int[] boardState = new int[25];
Queue<int[]> queue = new LinkedList<int[]>();

public solve() {
    gui();
    init();
}

public void gui() {
    f = new JFrame("Solution");
    f.setVisible(true);
    f.setSize(500,500);
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    p1 = new JPanel();
    p1.setLayout(new GridLayout(nRows, nColumns, 0, 0));

    buttonArray = new JButton[nTotalButtons];
    for (int nNum = 0; nNum < nTotalButtons; nNum++) {
        buttonArray[nNum] = new JButton("");
        add(buttonArray[nNum]);
        //buttonArray[nNum].setBackground(Color.white);
        buttonArray[nNum].setActionCommand("" + nNum);
        p1.add(buttonArray[nNum]);
    }

    f.add(p1);
}

public void init() {
    //drawing text input
    int i;
        for(i=0; i<25; i++)
            System.out.println(outputArray[i]);
    for(i=0; i<nTotalButtons; i++){
        if(outputArray[i] == 1)
            buttonArray[i].setBackground(Color.yellow);
    }
}

public static void main(String[] args) {
}

}

我也很欣赏有关Java中正确编程实践的技巧。自从我用这种语言编写代码以来已经有很长一段时间了,所以我只是想从我记忆中创建一个程序..

2 个答案:

答案 0 :(得分:1)

问题在于您决定的变量(按钮的颜色)会重置,因为您正在重新创建gui方法中的按钮,该方法是从solve调用的。结果,您的初始1再次转为0,这是init期间打印的内容。

大提示:不要将GUI属性用于核心逻辑。

答案 1 :(得分:1)

即使课程solve延伸LightsOutPuzzle,它也是一个不同的对象,因此拥有自己的outputArray副本。在代码的第一部分中,您要在outputArray中打印LightsOutPuzzle实例,该实例已初始化为:

LightsOutPuzzle中的

ActionListener

    public class Action implements ActionListener {
        public void actionPerformed (ActionEvent e) {
            int i;

            save();
            for(i=0; i<25; i++)
                    {
                      /////////////PRINTS OUT outputArray IN LightsOutPuzzle
                      System.out.println(outputArray[i]);
                    }

                    ////CREATES NEW solve OBJECT WITH ITS OWN outputArray COPY
                    new solve();
        }
    }

然后,当您调用solve构造函数时,您正在打印尚未初始化的solve副本并且全部为零:

解决课程中的初始化方法

public void init() {
    //drawing text input
    int i;
        for(i=0; i<25; i++)
                     {
                         //////PRINTS OUT outputArray IN solve CLASS
                         System.out.println(outputArray[i]);
                     }
                     for(i=0; i<nTotalButtons; i++){
                        if(outputArray[i] == 1)
                           buttonArray[i].setBackground(Color.yellow);
                      }
      }