我试图在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();
}
}
答案 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];