1

我有一个带有监听器的 JComponent。在 JComponent 上,我绘制了一个大图像,鼠标侦听器在发生点击的地方添加了小图像(我在一张大地图上添加了一些点)。

如何以编程方式在paintComponent 方法之外绘制一些东西?

 public void paintComponent(Graphics g) {
   Graphics2D g2 = (Graphics2D) g;

   g2.drawImage(img1, 0, 0, this);
   g2.finalize();

 }

 private MouseListener listener; 

 public void initListener() {
   myCanvas = this;
   listener = new MouseAdapter() {
     public void mouseClicked(MouseEvent e) {
       myCanvas.getGraphics().drawImage(img,e.getX(),e.getY(), myCanvas);
     }
   };
   addMouseListener(listener);

 }

我的问题是:

public void drawDot(int x, int y){
 myCanvas.getGraphics().drawImage(img, x, y, myCanvas);
}

它什么也没做。我试过重绘()。

4

3 回答 3

2

你不能这样做。所有绘图都发生在paintComponent() 方法中。您应该做的是构建一个模型来表示您想要绘制的内容,并在您的鼠标侦听器中修改模型。然后调用 repaint() 要求在修改模型时重绘这个组件。在您的 paint() 方法中,从模型中渲染完整的油漆。例如:

List<Point> pointsToDrawSmallerImage = new ArrayList<Point>();

...

listener = new MouseAdapter() {
    public void mouseClicked(MouseEvent evt ) {
        pointsToDrawSmallerImage.add( evt.getPoint() );
        repaint();
    }
}
...

public void paintComponent(Graphics g) {
    g.clear();   // clear the canvas
    for( Point p : pointsToDrawSmallerImage ) {
       g.drawImage(img, p.x, p.y, myCanvas);           
    }
}
于 2011-10-24T20:33:55.950 回答
2

您必须在paintComponent方法内管理绘图。Java Graphics 不是有状态的,您必须注意在方法中绘制您想要的任何内容。每次调用paint方法时,必须重新绘制所有内容,在添加其他组件时没有任何东西“停留”在画布上

这意味着您应该存储paint方法将注意绘制的元素列表,例如。ArrayList<Point> points,然后在paint方法中你应该迭代它们:

for (Point p : points)
  draw the point

这样您只需将点添加到带有侦听器的列表中并调用 repaint。您可以在此处找到 Swing/AWT 绘图的指南..

一个特定的 API 具有您想要的行为,它被称为Cocos2D,它有一个用于 Android/Java 的端口,您可以在此处找到。

于 2011-10-24T20:35:53.867 回答
0

这不是draw的工作方式,draw方法在每次重绘时都会绘制方法本身中的所有内容,这意味着如果您调用一个方法来绘制一次,它只会被绘制一个重绘周期,仅此而已。

如果您想在单击时绘制某些内容,则必须在单击时将其添加到集合中,并在每个绘制周期中绘制整个集合,因此它将永久保留。

于 2011-10-24T20:34:05.450 回答