为什么只有一个矩形被画在这里,即使我调用repaint()
方法多次在我的for()
循环?此外,我想显示每行8个矩形和每列8个矩形,中间有2像素的空间。有什么想法或帮助吗?
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坐标,然后迭代数组/列表来绘制多个矩形,而在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);
}
}
假设你有这样一个类RectModel
,它保存一个矩形(x1
,y1
,x2
,y2
)的数据,你有一个方法m_Mod.getRectangles()
,它返回RectModel
实例的数组/列表。当你在控制器中执行simulate()
方法时,你将计算你想要绘制的所有矩形并将它们保存在Model
类的this.rectangles
数组/列表中。之后,paintComponent()
方法填充使用该数组/列表并绘制矩形。