1

我正在做一个绘图板,我有几个问题。

  1. 每当我尝试使用它时,它都不会自动更新。广告我通常必须调整屏幕大小才能更新。
  2. 我怎样才能做类似 mouseDragged 函数的事情,我可以在其中不断获得 x 和 y 坐标?

这是代码:

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
    }
}
4

2 回答 2

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坐标?

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

于 2012-05-29T01:41:04.597 回答
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在那时重新创建。

于 2012-05-29T02:10:17.117 回答