【问题标题】:array loses data when GUI is clicked单击 GUI 时数组丢失数据
【发布时间】:2012-02-27 21:17:54
【问题描述】:

问题:

  • 制作对象数组
  • 只要我单击 GUI,数组就会设置为 null
  • 我跟踪了代码,发现我的阵列设置正确

代码如下:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Puzzle1 extends JPanel{
        public Square[] sq;
        public String zero = "16";

    public class Square{
            public int realPos;
            public int curPos;
        }

    public String setAdjacent(String curZero, int z){
        String adj = "-1";
        int zeroInt = Integer.parseInt(curZero);
        if(z==0){
                adj = Integer.toString(zeroInt+1);
                if(zeroInt+1 == 17 || zeroInt+1 == 13 || zeroInt+1 == 9 || zeroInt+1 == 5){
                    adj = "-1";
                }
            }
            if(z==1){
                adj = Integer.toString(zeroInt-1);
                if(zeroInt-1 == 0|| zeroInt-1 == 4 || zeroInt-1 == 8 || zeroInt-1 == 12){
                    adj = "-1";
                }
            }
            if(z==2){
                adj = Integer.toString(zeroInt+4);
                if(zeroInt+4 > 16){
                    adj = "-1";
                }
            }
            if(z==3){
                adj = Integer.toString(zeroInt-4);
                if(zeroInt-4 < 1){
                    adj = "-1";
                }
            }

        return adj;
    }
    public static void buildGUI(){
        JFrame frame = new JFrame("Puzzle");
        Puzzle1 panel = new Puzzle1();
        GridLayout mainLayout = new GridLayout(1, 1);
        panel.setPreferredSize(new Dimension(300, 300));
        panel.setMinimumSize(new Dimension(300, 300));
        panel.setMaximumSize(new Dimension(300, 300));
        frame.setResizable(false);
        panel.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
        Puzzle1 p1 = new Puzzle1();
        panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        p1.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        p1.setName("1");
        panel.setLayout(mainLayout);    
        p1.add(new JLabel("1"));
        panel.add(p1);
        frame.setContentPane(panel);
        frame.setSize(300,300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //closes thread on close. 
        frame.setVisible(true);
    }

    public void clicked(JPanel pnlClick){
                String adj[] = new String[4]; 
            for(int z=0; z<4; z++){
                adj[z] = setAdjacent(zero, z);
            }
            String clicked = pnlClick.getName();
            for(int i = 0; i<4; i++){
                String stAdj = adj[i];
                System.out.println(stAdj);
                    int clkd = Integer.parseInt(clicked);
                sq[clkd].curPos = 0;
                System.out.println("clicked and adj");
            }
    }
    class MouseEventHandler implements MouseListener{       
        @Override
        public void mouseClicked(MouseEvent e) {
            JPanel pnlClick = (JPanel)(e.getSource());
            clicked(pnlClick);
        }

        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }
        @Override
        public void mouseExited(MouseEvent arg0) {
        }
        @Override
        public void mousePressed(MouseEvent arg0) {
        }
        @Override
        public void mouseReleased(MouseEvent arg0) {
        }

    }

    public Puzzle1() {
        MouseEventHandler handler = new MouseEventHandler();
        this.addMouseListener(handler);
    }

    public void createSquares(){
        sq = new Square[16];
        for(int j = 0; j < 16; j++){
            sq[j] = new Square();
        }
        for(int i = 0; i < 16; i++){
            if(i == 0){
                sq[i].realPos = 16;
                sq[i].curPos = 0;
            }
            else{
                sq[i].realPos = i;
                sq[i].curPos = i;
            }

        }
    }

    public static void main(String[] args){
        Puzzle1 Puzzle1 = new Puzzle1();
        Puzzle1.buildGUI();
        Puzzle1.createSquares();
    }
}

我尝试在单击后可能会擦除“sq”变量的任何地方中断,但调试器总是直接转到mouseClicked 事件,并且调试器显示“sq”为空。

【问题讨论】:

  • 我发布的代码无法编译。我的代码编译了。
  • 请澄清——当你说“它总是存在”和“它是空的”时,这两个“它”指的是什么?
  • 好的@AndrewThompson 我编辑了代码以便编译。感谢 SSCCE 的建议。

标签: java arrays swing nullpointerexception


【解决方案1】:

在调用 addMouseListener 之前在 Puzzle1 构造函数中调用 createSquares

【讨论】:

  • 我给你一个提示。您正在创建 3 个不同的 Puzzle1 对象,但只在其中一个上调用 createSquares()。
【解决方案2】:

尝试clicked 方法的这种变体并仔细检查输出。

public void clicked(JPanel pnlClick){
            String adj[] = new String[4];
        for(int z=0; z<4; z++){
            adj[z] = setAdjacent(zero, z);
        }
        String clicked = pnlClick.getName();
        System.out.println("Clicked name: " + clicked);
        for(int i = 0; i<4; i++){
            String stAdj = adj[i];
            System.out.println(stAdj);
            if(clicked.equals(stAdj)){
                int clkd = Integer.parseInt(clicked);
                sq[clkd].curPos = 0;
                System.out.println("clicked and adj");
            }
        }
}

【讨论】:

  • 感谢 Andrew 引起我的注意,这绝对是一个错误,但不幸的是我在修复此问题后仍然遇到同样的问题。在我尝试解决发布的问题之前没有发生此错误。我最初有 Puzzle1 p1 = new Puzzle1();我将其更改为 JPanel p1 = new JPanel();改回来解决了你提到的问题。我会更新代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
  • 2011-08-29
  • 2014-02-15
  • 2020-03-13
  • 1970-01-01
  • 2015-09-14
相关资源
最近更新 更多