编译器无法识别操作侦听器类中的参数

问题描述 投票:0回答:3

我正在尝试构建 JPanel 矩阵和清除按钮,当您按下屏幕时,特定位置的面板会显示为黑色,而当您按下清除时,所有内容都会变成白色。我不知道为什么,但在我的动作侦听器类中,它无法识别 Painters 类中的参数和对象。

Cell.java

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

矩阵.java

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

画家.java

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

测试器.java

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);
    }
}
java swing jpanel actionlistener
3个回答
3
投票

尝试这样做, “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];
    }
}

3
投票
Painter.this.matric[i][j]

您可以访问指定类别的

this


3
投票
  1. (在 Painter$MyActionListener 类中)- 当您在

    this
    类中使用
    ActionListener
    时,
    this
    指的是
    ActionListener
    类(没有这些变量)而不是
    Painter
    类变量。 (行、列、矩阵)。因此,请删除您在
    this
    类中使用的所有
    ActionListener
    或使用
    Painter.this.variable

  2. (在 Painter 类中)-

    Matrix matrix
    需要是
    [][]
    ,因为您正在尝试使用
    matrix[i][j]
    。我看到 Matrix 类有一个二维单元格数组。您可能想要在 Matix 类中使用一个
    getMatrix()
    方法来返回 Cells 的二维数组。使用
    Marix matrix
    Cell[][] martrix
    代替
    Matrix m
    ,然后执行
    matrix = m.getMatrix()
    。或者某种程度的东西

© www.soinside.com 2019 - 2024. All rights reserved.