java - 在Java中绘制方阵

标签 java matrix

我正在练习 Java swing。我创建了一个矩阵作为 Rectangle2D 对象的二维数组。我已经设置了 MouseListener 来绘制被单击的方 block 。我已经设置了 for 循环来检查单击了哪个方 block 。当我点击一个正方形时,它会被涂成蓝色。问题是,当我点击另一个方 block 时,第一个方 block 变成白色,另一个变成蓝色。我的问题是,如何保留第一次点击的方 block 的颜色?

这是Matrica(Matrix)类的代码(在我的母语中,crtanjeMatrice意思是drawMatrixduzina长度

public class Matrica extends JPanel implements MouseListener {
Rectangle2D[][] matrica = new Rectangle2D[8][8];
Color boja = Color.white;
int a = 0;
int b = 0;

    public Matrica() {
        addMouseListener(this);
    }

    public void paint(Graphics g){
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.clearRect(0, 0, this.getWidth(), this.getHeight());
        crtanjeMatrice(g2);
        g2.setColor(boja);
        g2.fill(matrica[a][b]);

    }




    private void crtanjeMatrice(Graphics2D g2){
        g2.setColor(Color.black);
        int startX = 0;
        int startY =0;
        int duzina = 50;
        for(int i=0; i < matrica.length; i++){
            for(int j = 0; j < matrica.length; j++){
                matrica[i][j] = new Rectangle2D.Double(startX,startY,duzina,duzina);
                g2.draw(matrica[i][j]);
                startX = startX + duzina;
            }
            startY = startY + duzina;
            startX = 0;
        }

    }


    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
        int m,n;
        int x = e.getX();
        int y = e.getY();
        for(int i = 0; i < matrica.length; i++)
        for(int j =0; j < matrica.length; j++)
            if(matrica[i][j].contains(x, y)){
                boja = Color.blue;
                a = i;
                b = j;
                repaint();
            }
    }


    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

}

最佳答案

您当前正在 paint 方法中绘制单个矩阵单元:

g2.fill(matrica[a][b]);

但您需要“记住”哪些矩形已被单击。为此,可以使用一个简单的List来存储已单击的矩形的索引。基于Point 类的类提供了一种在列表中存储行列索引信息的好方法。

@Override
protected void paintComponent(Graphics g) {
   super.paintComponent(g);
   Graphics2D g2 = (Graphics2D) g;
   g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
   g2.clearRect(0, 0, this.getWidth(), this.getHeight());
   crtanjeMatrice(g2);
   for (MyRowColumn index : indexList) { // MyRowColumn based on Point
     g2.setColor(Color.blue);
     g2.fill(matrica[index.x][index.y]);
   }
}
<小时/>

旁白:,不要使用覆盖 paint,而是覆盖 paintComponent 并记住调用 super.paintComponent > 渲染子组件。

关于java - 在Java中绘制方阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14063155/

相关文章:

r - 通过对角 block 分割方阵

java - 导入 SSL 证书时出错 : Not an X. 509 证书

java - 如何对对象的 ArrayList 进行排序?

c# - 如何从 javadoc 中排除某些类/包/公共(public)成员

excel - 使用 Excel 计算协方差矩阵

python - 使用 numpy 将矩阵高对角线归零

javascript - react native Android : Showing an Activity from Java

java - ReentrantLock - unlock() 方法似乎不适用于列表

Matlab 不返回特征向量的正交矩阵

java - 有人可以解释矩阵(安德森先生)吗?