使用drawRect时图形太慢

时间:2012-05-29 01:38:22

标签: java performance awt drawrect

我正在制作绘图板,我有几个问题。

  1. 每当我尝试绘制它时,它都不会自动更新。广告我通常需要调整屏幕大小才能更新。
  2. 我怎样才能做类似mouseDragged功能的东西,我可以不断获得x和y坐标?
  3. 以下是代码:

    import java.awt.geom.*;
    class griddedInput extends JComponent implements MouseListener
    {
        int SIZE = 10;
        int scSize = 300;
        int sSize = scSize/SIZE;
        boolean [][] grid = new boolean[sSize][sSize];
        public griddedInput(boolean grid[][])
        {
            grid=grid;
            setPreferredSize(new Dimension(scSize,scSize));
            addMouseListener(this);
        }
        public void paintComponent(Graphics g)
        {
            Graphics2D g2 = (Graphics2D) g;
            int x, y;
            for(y = 0; y < sSize; y ++) {
                for(x = 0; x < sSize; x ++) {
                    if(grid[y][x])
                        g2.setColor(Color.BLACK);
                    else
                        g2.setColor(Color.WHITE);
                    g2.fillRect((x * SIZE), (y * SIZE), sSize, sSize);
                }
            }
        }
    
        @Override
        public void mouseClicked(MouseEvent e) {
            int squareX = (int)e.getX() / SIZE;
            int squareY = (int)e.getY() / SIZE;
            grid[squareY][squareX] = !grid[squareY][squareX];
        }
    
        @Override
        public void mouseEntered(MouseEvent e) {
            // TODO Auto-generated method stub      
        }
    
        @Override
        public void mouseExited(MouseEvent e) {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void mousePressed(MouseEvent e) {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void mouseReleased(MouseEvent e) {
            // TODO Auto-generated method stub
        }
    }
    

2 个答案:

答案 0 :(得分:1)

您希望随时在绘图组件上调用repaint(),以便向JVM建议它被绘制 - 很可能是在您的MouseListener方法中。

如,

@Override
public void mouseClicked(MouseEvent e) {
    int squareX = (int)e.getX() / SIZE;
    int squareY = (int)e.getY() / SIZE;
    grid[squareY][squareX] = !grid[squareY][squareX];
    repaint();
}

为了加快重新绘制速度,您还可以调用重载方法,该方法允许您重新绘制GUI的选定矩形,但我敢打赌,您不需要为此GUI执行此操作。

如果您希望其他人能够更好地理解并帮助您,您还希望对代码缩进不那么“有创意”。

修改
关于:

  

2.我如何做一些像mouseDragged函数的东西,我可以不断获得x和y coords?

还添加MouseMotionListener。它可以是同一个类,实际上我通常使用一个匿名内部类,一个扩展MouseAdapter,一个我的单个实例用于MouseListener和MouseMotionListener。我在这个论坛的几个帖子中都有使用它的例子。

答案 1 :(得分:1)

我的结构会有所不同:

private BufferedImage bi = new BufferedImage(getWidth(), getHeight());
private Graphics2D big = bi.createGraphics();

public void paintComponent(Graphics g)
{
    Graphics2D g2 = (Graphics2D) g;
    g2.drawImage(bi, 0, 0, this);
}

@Override
public void mouseClicked(MouseEvent e) {
    int squareX = (int)e.getX() / SIZE;
    int squareY = (int)e.getY() / SIZE;
    boolean b = !grid[squareY][squareX];
    grid[squareY][squareX] = b;
    if(b)
        big.setColor(Color.BLACK);
    else
        big.setColor(Color.WHITE);
    big.fillRect((x * SIZE), (y * SIZE), sSize, sSize);
    repaint();
}

mouseClicked执行单个fillRectpaintComponent执行单个drawImage。将其与每次重绘时执行 900 fillRects的原始代码进行比较。

您还需要检测大小的变化并在那时重新创建BufferedImage