java – 绘制一个在下一个绘画中不会消失的矩形
|
我试图创建一个绘制矩形的JPanel.小组需要绘制很多矩形,但它们不会移动.
class MyPanel extends JPanel{
private int x,size;
private Color c;
public void DrawRect(int x,int y,int size,Color c){
this.x = x;
this.y = y;
this.size = size;
this.c = c;
repaint();
}
@Override
public void
paint(Graphics g) {
g.setColor(c);
g.fillRect(x,size,size);
}
} 解决方法>不要在没有非常的情况下覆盖绘画,非常好的理由……使用paintComponent代替>总是打电话给super.paintXxx,这些方法在后台做了很多,没有打电话给超级只会回来困扰你. >如果您使用多个窗格作为矩形,请使MyPanel透明. 油漆是无国籍的.最后一个油漆和下一个油漆之间没有任何联系.在每个绘制请求中,您需要更新整个状态. 安德鲁建议的双缓冲(或后缓冲)是非常好的,我强烈建议你看一下实现它. 与此同时,我把这个小例子放在一起…… 基本上,您按住鼠标按钮,它将每40毫秒(大约每秒25帧)随机添加另一个矩形到面板. 我没有任何问题得到了1000个rects,能够调整窗口大小没有发出或明显减慢… public class MyPanel extends JPanel {
private List<MyRectangle> lstShapes;
private Timer populate;
public MyPanel() {
lstShapes = new ArrayList<MyRectangle>(25);
populate = new Timer(40,new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int x = (int) (Math.random() * getWidth());
int y = (int) (Math.random() * getHeight());
int width = (int) (Math.random() * (getWidth() / 4));
int height = (int) (Math.random() * (getHeight() / 4));
if (x + width > getWidth()) {
x = getWidth() - width;
}
if (y + height > getHeight()) {
y = getHeight() - height;
}
Color color = new Color(
(int) (Math.random() * 255),(int) (Math.random() * 255),(int) (Math.random() * 255));
lstShapes.add(new MyRectangle(x,width,height,color));
repaint();
}
});
populate.setInitialDelay(0);
populate.setRepeats(true);
populate.setCoalesce(true);
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
populate.restart();
}
@Override
public void mouseReleased(MouseEvent e) {
populate.stop();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
for (MyRectangle rect : lstShapes) {
rect.paint(g2d);
}
FontMetrics fm = g2d.getFontMetrics();
String text = Integer.toString(lstShapes.size());
g2d.setColor(getForeground());
g2d.drawString(text,getWidth() - fm.stringWidth(text),getHeight() - fm.getHeight() + fm.getAscent());
}
public class MyRectangle extends Rectangle {
private Color color;
public MyRectangle(int x,int width,int height,Color color) {
super(x,height);
this.color = color;
}
public Color getColor() {
return color;
}
public void paint(Graphics2D g2d) {
g2d.setColor(getColor());
g2d.fill(this);
}
}
}
有一个去,很有趣;) ps-在我注意到减速之前我达到了超过5000个矩形(我将代码修改为10毫秒延迟并且每个滴答添加10个新矩形) (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
