为什么这里只画了一个矩形?
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.rectangles
array/list的Model
class中].之后 paintComponent()
方法填充使用 array/list 并绘制矩形。
为什么我在 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.rectangles
array/list的Model
class中].之后 paintComponent()
方法填充使用 array/list 并绘制矩形。