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


它什么也没做。我尝试过repaint()。

最佳答案

你做不到所有绘图都发生在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);
    }
}

10-08 01:42