我的班级看起来像这样。
import java.awt.*;
import javax.swing.*;
public class Painter extends JPanel {
int x=200;
int y=200;
int newX;
int newY;
Painter(){
setPreferredSize(new Dimension(400,400));
}
public void moveSquare(int newX, int newY){
if(newY != y|| newX != x){
repaint(x,y, 10, 10);
y = newY;
x = newX;
repaint(x,y, 10, 10);
}
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(x, y, 10, 10);
}
}
从另一个类调用这些方法。 x
和y
的值确实会改变它们应该的方式。然而广场不动。我在这里做错了吗?
答案 0 :(得分:4)
您需要致电super.paintComponent(g)
而不是paintComponent(g)
in
public void paintComponent(Graphics g)
否则你将无限循环。
答案 1 :(得分:2)
调用repaint(x, y, w, h)
仅将选择区域设置为脏; Graphics
围绕此边界设置剪辑,因此您只会看到那里发生的变化。使用不带任何参数的repaint()
会将整个区域标记为脏: - )
根据Oracle关于AWT的文章paint
(找到here),
当AWT调用此方法时,
Graphics
对象参数已预先配置了适合绘制此特定组件的状态:
- 图形对象的颜色设置为组件的
foreground
属性。- Graphics对象的 font 设置为组件的
font
属性。- 设置Graphics对象的 translation ,使坐标(0,0)代表组件的左上角。
- Graphics对象的剪辑矩形设置为需要重新绘制的组件区域。
要对此进行测试,请尝试打印g.getClip
: - )
我会给你一个提示......
java.awt.Rectangle[x=0,y=0,width=10,height=10] java.awt.Rectangle[x=0,y=0,width=10,height=10] java.awt.Rectangle[x=0,y=0,width=10,height=10]
这是一个固定的moveSquare
...
public void moveSquare(int newX, int newY){
if (newY != y|| newX != x) {
y = newY;
x = newX;
repaint();
}
}