Java图形麻烦

时间:2011-10-24 20:25:36

标签: java swing awt graphics2d paintcomponent

我有一个带有侦听器的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);
}

它没有做任何事情。我试过重绘()。

3 个答案:

答案 0 :(得分: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);           
    }
}

答案 1 :(得分:2)

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

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

for (Point p : points)
  draw the point

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

特殊API具有您希望拥有的行为,它被称为 Cocos2D ,它有一个Android / Java端口,您可以找到here

答案 2 :(得分:0)

这不是绘制的工作原理,draw方法会在每次重绘时绘制方法本身的所有内容, 这意味着如果你调用一个方法来绘制一次,它只会被绘制一个重绘周期,就是这样。

如果你想在点击时绘制一些东西,你必须在点击一个集合时添加它,并在每个绘画周期中绘制整个集合,这样它将永久保留。