如何使用构造函数外的按钮?

时间:2014-07-04 13:45:19

标签: java swing nullpointerexception jbutton

我试图在java中创建幻灯片拼图。我在构造函数中创建了一个包含9个按钮(3x3)的数组。现在我想要按钮滑动(用空文本按钮交换位置),或者我只是交换文本。但是使用当前代码,当我点击按钮时,我在运行时获得了空指针异常。我认为是因为我在构造函数中创建的按钮对象在函数actionPerformed中无法访问。如何访问功能中的按钮?

package game1;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.event.ActionEvent;

public class Shuffle implements ActionListener
{
    JFrame f;
    JButton b[][];

    public Shuffle()
    {
        int i,j;
        f=new JFrame("Shuffle");
        f.setLayout(new GridLayout(3,3));
        f.setVisible(true);

        JButton b[][]=new JButton[3][3];

        /*  
        for(int i=0;i<button.length;i++)
        {
            button[i] = new JButton();
            button[i].setText(Integer.toString(i+1));
        } 
        */
        int t=1;
        for (i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
            {
                if(i==2 && j==2)
                {
                    b[i][j]=new JButton();
                    f.add(b[i][j]);
                    t=t+1;                  
                }
                else
                {
                    b[i][j]=new JButton(""+t+"");
                    f.add(b[i][j]);
                    t=t+1;
                }
            }
        }
        for (i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
            {
                b[i][j].addActionListener(this);                    
            }
        }
    }

    public void actionPerformed(ActionEvent e)
    {
        int x,y;
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<3;j++)
            {
                if(e.getSource()==b[i][j])
                {
                    x=i;y=j;
                    System.out.println(x+" "+y);
                }                   
            }
        }   
    }

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

3 个答案:

答案 0 :(得分:1)

您已在构造函数中声明了一个局部变量b,该变量隐藏了字段b。不要这样做。而不是

JButton b[][] = new JButton[3][3];

写一下

b = new JButton[3][3];

将数组分配给字段,而不是局部变量。

答案 1 :(得分:1)

从此处更改按钮init:

JButton b[][]=new JButton[3][3];

到此:

b=new JButton[3][3];

答案 2 :(得分:0)

试用此代码

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;


class Shuffle implements ActionListener {

JFrame f;
JButton b[][]=new JButton[3][3]; //This is where I changed the code

public Shuffle() {
    int i, j;
    f = new JFrame("Shuffle");
    f.setLayout(new GridLayout(3, 3));
    f.setVisible(true);



    //JButton b[][] = new JButton[3][3];   //This is where I changed the code
    /*  for(int i=0;i<button.length;i++){
     button[i] = new JButton();
     button[i].setText(Integer.toString(i+1));
     } */
    int t = 1;
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            if (i == 2 && j == 2) {
                b[i][j] = new JButton();
                f.add(b[i][j]);
                t = t + 1;

            } else {
                b[i][j] = new JButton("" + t + "");
                f.add(b[i][j]);
                t = t + 1;
            }
        }
    }
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            b[i][j].addActionListener(this);

        }
    }

}

public void actionPerformed(ActionEvent e) {
    System.out.println(""+e.getSource());
    int x, y;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (e.getSource() == b[i][j]) {
                x = i;
                y = j;
                System.out.println(x + " " + y);
            }

        }
    }

}

public static void main(String[] args) {

    new Shuffle();

}

}

导致错误 在构造函数中,您创建了另一个局部变量b[][]。您已分配2D阵列。您不需要创建另一个变量,因为已经创建了一个属性。所以初始化它。

还有另一种方法。那就是在构造函数中初始化属性b[][]。然后不需要您的属性初始化 应在构造函数方法

中添加以下语句

b[][] = new JButton[3][3];