为什么这里只画了一个矩形?

Why is only one rectangle being painted here?

为什么我在 for() 循环中多次调用 repaint() 方法,但这里只绘制了一个矩形?此外,我想每行显示 8 个矩形,每列显示 8 个矩形,中间有 2 个像素 space。有什么想法或帮助吗?

package PROG2;

import java.awt.*;
import java.util.*;
import javax.swing.*;

class Model {
    
    int m_width;
    int m_height;
    int m_x1 = 50;
    int m_y1 = 50;      //Information about the model
    int m_x2 = 100;
    int m_y2 = 30;
    int counter = 0;    //Assisting variable
    
    Model(int width,int height) {
        m_width = width;
        m_height = height;
    }
    void math() {
        counter = counter + 2;
        counter = counter + m_x2;
        m_x1 = counter;
    }
}

class View extends JComponent {
        
        private Model m_Mod;
        
        View(Model mod) {
            m_Mod = mod;
        }

        @Override
        protected void paintComponent(Graphics g) {
            
            //super.paintComponent(g);
            
            g.setColor(Color.green);
            g.drawRect(m_Mod.m_x1,m_Mod.m_y1,
                    m_Mod.m_x2,m_Mod.m_y2);
            g.fillRect(m_Mod.m_x1,m_Mod.m_y1,
                    m_Mod.m_x2,m_Mod.m_y2);
        }
    
}
        
class Controller {
    
    private Model m_Mod;
    private View m_View;
    
        Controller(){
                m_Mod = new Model(500,500);
                m_View = new View(m_Mod);
                JFrame frame = new JFrame();
                frame.add(m_View);
                frame.setSize(m_Mod.m_width,m_Mod.m_height);
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                //Graphics g = frame.getGraphics();
        }
        void simulate(int right, int down){
            
            for( int i = 0; i < right; i++) {
            m_Mod.math();
            m_View.repaint();
            }
            
        }
        
}
        
class Übung2{
    
    public static void main(String[] args) throws Exception {
        Controller c = new Controller();    
        c.simulate(8, 8);
    }
        
}

即使您多次调用 repaint(),实际绘图只会在稍后发生一次(直到 swing 再次触发重绘)。那个时候执行paintComponent()方法的内容。您方法中的代码仅绘制一个矩形 (drawRect()) 和一个填充矩形 (fillRect()),仅此而已。所以你不会得到比你在你的方法中写的更多的东西。

您可以使用数组(或列表)来存储矩形的多个 XY 坐标,然后在 array/list 上迭代以在 paintComponent() 的单个调用中绘制多个矩形。代码可能如下所示:

@Override
protected void paintComponent(Graphics g) {
    //super.paintComponent(g);
        
    g.setColor(Color.green);
    foreach (RectModel rect: m_Mod.getRectangles()) {
        g.drawRect(rect.x1, rect.y1, rect.x2, rect.y2);
    }
}

这假设你有这样一个 class RectModel 它保存一个矩形的数据 (x1, y1, x2, y2) 并且你有一个方法 m_Mod.getRectangles() 其中 returns 一个 array/list 的 RectModel 个实例。当你在你的controller中执行simulate()方法时,你会计算出所有你想要绘制的矩形,并将它们保存在this.rectanglesarray/list的Modelclass中].之后 paintComponent() 方法填充使用 array/list 并绘制矩形。