我正在尝试构建 JPanel 矩阵和清除按钮,当您按下屏幕时,特定位置的面板会显示为黑色,而当您按下清除时,所有内容都会变成白色。我不知道为什么,但在我的动作侦听器类中,它无法识别 Painters 类中的参数和对象。
package Paint;
import java.awt.Color;
import javax.swing.*;
public class Cell extends JPanel {
private JPanel p;
public Cell() {
this.p = new JPanel();
this.setSize(50, 50);
this.setBackground(Color.white);
}
}
package Paint;
import java.awt.GridLayout;
import javax.swing.*;
public class Matrix extends JPanel {
private Cell[][] matrix;
public Matrix(int row , int col) {
this.setLayout(new GridLayout(row, col));
this.matrix = new Cell[row][col];
for(int i=0; i< row ; i++) {
for(int j=0; j<col; j++) {
this.matrix[i][j] = new Cell();
}
}
}
}
package Paint;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Painter extends JPanel {
private JButton btn;
private Matrix matrix ;
private int row , col;
public Painter(int row , int col) {
this.row = row;
this.col = col;
this.matrix = new Matrix(row, col);
this.setLayout(new BorderLayout());
btn = new JButton("clear");
this.add(matrix , BorderLayout.CENTER);
this.add(btn , BorderLayout.SOUTH);
}
private class MyActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(e.getSource() == btn) {
for(int i= 0; i< row; i++) {
for (int j= 0 ; j < col ; j++) {
this.matrix[i][j].setBackground(Color.white);
}
}
} else {
for(int i= 0; i< this.row; i++) {
for (int j= 0 ;this.col ; j++) {
if(e.getSource()== this.matrix[i][j]) {
if(this.matrix[i][j].getBackground()== Color.white)
this.matrix[i][j].setBackground(Color.black);
else
this.matrix[i][j].setBackground(Color.white);
}
}
}
}
}
}
}
package Paint;
import javax.swing.JFrame;
import ShayExam.MyPanel;
import javax.swing.JFrame;
public class Tester {
public static void main(String[] args) {
JFrame frame = new JFrame("matrix");
frame.setSize(750, 750);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
System.out.println("before Painter");
Painter p = new Painter( 6 , 6);
frame.add(p);
frame.setVisible(true);
}
}
尝试这样做, “this” 指的是您在其中使用 “this” 关键字的类的调用实例。可以在内部类中直接访问外部类的数据成员。您不能在
for
循环的条件部分使用 col。 actionPerfomed()
不会被调用,因为您必须将 ActionListener
添加到任何实例。
这段代码没有编译错误。
private class MyActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(e.getSource() == btn) {
for(int i= 0; i< row; i++) {
for (int j= 0 ; j < col ; j++) {
matrix.getCell(i,j).setBackground(Color.white);
}
}
} else {
for(int i= 0; i< row; i++) {
for (int j= 0 ;j<col ; j++) {
if(e.getSource()== matrix.getCell(i,j)) {
if(matrix.getCell(i,j).getBackground()== Color.white)
matrix.getCell(i,j).setBackground(Color.black);
else
matrix.getCell(i,j).setBackground(Color.white);
}
}
}
}
}
}
和矩阵类
public class Matrix extends JPanel {
private Cell[][] matrix;
public Matrix(int row , int col) {
this.setLayout(new GridLayout(row, col));
this.matrix = new Cell[row][col];
for(int i=0; i< row ; i++) {
for(int j=0; j<col; j++) {
this.matrix[i][j] = new Cell();
}
}
}
public Cell getCell(int i, int j) {
return matrix[i][j];
}
}
Painter.this.matric[i][j]
您可以访问指定类别的
this
(在 Painter$MyActionListener 类中)- 当您在
this
类中使用 ActionListener
时,this
指的是 ActionListener
类(没有这些变量)而不是 Painter
类变量。 (行、列、矩阵)。因此,请删除您在 this
类中使用的所有 ActionListener
或使用 Painter.this.variable
(在 Painter 类中)-
Matrix matrix
需要是 [][]
,因为您正在尝试使用 matrix[i][j]
。我看到 Matrix 类有一个二维单元格数组。您可能想要在 Matix 类中使用一个 getMatrix()
方法来返回 Cells 的二维数组。使用 Marix matrix
和 Cell[][] martrix
代替 Matrix m
,然后执行 matrix = m.getMatrix()
。或者某种程度的东西