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

Java 如何使用构造函数外部的按钮?,java,swing,nullpointerexception,jbutton,Java,Swing,Nullpointerexception,Jbutton,我正在尝试用java创建一个幻灯片拼图。我在构造函数中创建了一个包含9个按钮(3x3)的数组。现在,我想让按钮滑动(用空文本按钮交换位置),或者只交换文本。但在当前代码中,当我单击按钮时,在运行时会出现空指针异常。我认为这是因为我在构造函数中创建的按钮对象在actionPerformed函数中不可访问。如何访问功能中的按钮 package game1; import javax.swing.*; import java.awt.event.*; import java.awt.*; import

我正在尝试用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();
    }
}
packagegame1;
导入javax.swing.*;
导入java.awt.event.*;
导入java.awt.*;
导入java.awt.event.ActionEvent;
公共类Shuffle实现ActionListener
{
jf框架;
JButton b[][];
公开洗牌
{
int i,j;
f=新JFrame(“洗牌”);
f、 setLayout(新网格布局(3,3));
f、 setVisible(真);
JButton b[][]=新JButton[3][3];
/*  

对于(int i=0;i您已经在构造函数中声明了一个局部变量
b
,它隐藏了字段
b
。不要这样做。而不是

JButton b[][] = new JButton[3][3];
只要写

b = new JButton[3][3];

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

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

JButton b[][] = new JButton[3][3];
只要写

b = new JButton[3][3];

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

更改按钮初始化:

JButton b[][]=new JButton[3][3];
为此:

b=new JButton[3][3];

从以下位置更改按钮初始化:

JButton b[][]=new JButton[3][3];
为此:

b=new JButton[3][3];

尝试此代码

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

}
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
类Shuffle实现ActionListener{
jf框架;
JButton b[][]=新JButton[3][3];//这就是我更改代码的地方
公开洗牌{
int i,j;
f=新JFrame(“洗牌”);
f、 setLayout(新的GridLayout(3,3));
f、 setVisible(真);
//JButton b[][]=新JButton[3][3];//这就是我更改代码的地方

/*对于(int i=0;i请尝试此代码

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

}
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
类Shuffle实现ActionListener{
jf框架;
JButton b[][]=新JButton[3][3];//这就是我更改代码的地方
公开洗牌{
int i,j;
f=新JFrame(“洗牌”);
f、 setLayout(新的GridLayout(3,3));
f、 setVisible(真);
//JButton b[][]=新JButton[3][3];//这就是我更改代码的地方

/*为了(int i=0;iThanks太多了。我总是在初始化数组时遇到问题该死!我不知道该接受哪个答案!它们都是正确的!非常感谢。我总是在初始化数组时遇到问题该死!我不知道该接受哪个答案!它们都是正确的!非常感谢!我不知道该接受哪个答案。它们都是正确的!没问题,很高兴我能帮忙:)非常感谢!我不知道该接受哪个答案。他们都是正确的!没问题,很高兴我能帮忙:)非常感谢!所有答案都是正确的!不知道该接受哪一个作为正确答案。非常感谢!所有答案都是正确的!不知道该接受哪一个作为正确答案。