我有一个尺寸为50x50的二维数组(矩阵)。在这些矩阵中,每个位置的值都为0或1。 此矩阵由带有50x50按钮的网格布局显示,如果值为0或1,则为白色或黑色。 如果按下按钮,Matrix中的相关位置应将值更改为1。 为了实现这一点,我创建了Grid,每个矩阵位置都有一个Button,由for循环执行。我还为这个for循环中的每个Button实现了一个ActionListener。我尝试使用ActionListeners更改位置的值,方法是为函数创建按钮,为每个位置赋予ActionListener两个参数,用于矩阵中位置的行和列。 但是这是一个错误,所以如果按下按钮,我总是会得到一个NullPointerException。
import javax.swing.*;
import java.awt.*;
import javax.swing.border.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class Bild extends JFrame {
public Matrix matrix;
public JButton createButton(int a, int x, int y) {
JButton b = new JButton();
if(a==1){
b.setBackground(Color.WHITE);
}else{
b.setBackground(Color.BLACK);
}
b.addActionListener( new ActionListener(){
public void actionPerformed( ActionEvent arg0 ) {
matrix.matrix[x][y]=1;
}
});
this.add(b);
return b;
}
public Bild(Matrix matrix) {
matrix = matrix;
GridLayout layout = new GridLayout(50,50,0,0);
this.setLayout(layout);
for (int i = 0; i<50; i++) {
for(int j=0; j<50; j++){
if (matrix.matrix[i][j]==0){
this.add(createButton(1,i,j));
}else{
this.add(createButton(2,i,j));
}
}
}
}
}
public class Matrix{
int[][] matrix;
public Matrix(){
matrix = new int[50][50];
for(int i=0; i<50; i++){
for(int j=0; j<50; j++){
matrix[i][j]=0;
}
}
}
}
import javax.swing.*; // JFrame, JPanel, ...
import java.awt.*; // GridLayout
public class Main{
public static void main (String[] args) {
Matrix matrix = new Matrix();
JFrame frame = new Bild(matrix);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500,500);
frame.setVisible(true);
}
}
答案 0 :(得分:1)
public Bild(Matrix matrix) {
matrix = matrix;
}
矩阵会隐藏你的类变量,因此当你想要上课时,你必须对它进行改进 this.matrix ,
应该是this.matrix=matrix
这就是你获得NPE的原因。
了解更多信息https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html