我正在制作绘图板,我有几个问题。
以下是代码:
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
}
}
答案 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
执行单个fillRect
,paintComponent
执行单个drawImage
。将其与每次重绘时执行 900 fillRects
的原始代码进行比较。
您还需要检测大小的变化并在那时重新创建BufferedImage
。