我试图创建一个绘制矩形的JPanel.小组需要绘制很多矩形,但它们不会移动.
我的问题的一个解决方案是创建一个包含我已经创建的所有矩形的列表,并在每次调用“Paint”时绘制它们.但是有很多矩形,它会减慢计算机的速度.
我也尝试使用重绘(x,y,高度,宽度)来清理新矩形的空间,但它不起作用. (JPanel不断擦除以前的矩形.)
在排序中,我需要绘制每个油漆都不会消失的矩形.或者是一种不会擦除先前绘制的绘画方法,或者不会绘制背景.
这是我的JPanel类的一部分:
我的问题的一个解决方案是创建一个包含我已经创建的所有矩形的列表,并在每次调用“Paint”时绘制它们.但是有很多矩形,它会减慢计算机的速度.
我也尝试使用重绘(x,y,高度,宽度)来清理新矩形的空间,但它不起作用. (JPanel不断擦除以前的矩形.)
在排序中,我需要绘制每个油漆都不会消失的矩形.或者是一种不会擦除先前绘制的绘画方法,或者不会绘制背景.
这是我的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透明.
>总是打电话给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); } } }
有一个去,很有趣;)