2017-12-02 140 views
-1

我试图打开一个图像,在拖动鼠标的同时绘制一个矩形(鼠标拖动事件),并绘制最后一个矩形鼠标被释放。Java,Swing,Awt - 在图像上绘制矩形并使其可见

我实现拖动时绘制矩形,但我不能在此刻收集最终点的坐标以绘制矩形并存储其数据。你有什么想法来改进我的代码吗? (在背景中添加一个图像,即使在绘制几个图像时也会保留矩形)

我猜mousReleased Event可以帮助我,但我不知道该如何使用它。

编辑:在绘制第一个矩形后,如果绘制第二个矩形,我希望它保持可见。

package selectZone; 

import java.awt.event.*; 
import javax.swing.*; 
import java.awt.*; 

public class Rec extends JFrame { 

    public Rec() { 
     super("rectangle"); 
     setPreferredSize(new java.awt.Dimension(400, 400)); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     JPanel pane = new Pan(); 
     add(pane); 

     pack(); 
     setVisible(true); 

    } 

    public static void main(String[] args) { 
     new Rec(); 
    } 

} 

class Pan extends JPanel { 

    private Point origin; 
    private Point end; 
    private Point endFinal; 

    public Pan() { 
     MouseAdapter adapter = new Lis(); 
     addMouseMotionListener(adapter); 
     addMouseListener(adapter); 
    } 

    class Lis extends MouseAdapter { 
     public void mouseDragged(MouseEvent e) { 
      end = e.getPoint(); 
      repaint(); 
     } 

     public void mousePressed(MouseEvent e) { 
      origin = e.getPoint(); 
     } 

     public void mouseReleased(MouseEvent e, Graphics g) { 
      endFinal = e.getPoint(); 
      g.clearRect(0, 0, getWidth(), getHeight()); 
      g.setColor(Color.RED); 
      int x1 = (int) (origin.getX()); 
      int y1 = (int) (origin.getY()); 
      int x2 = (int) (endFinal.getX()); 
      int y2 = (int) (endFinal.getY()); 
      g.drawRect(x1, y1, x2 - x1, y2 - y1); 
     } 

    } 

    public void paint(Graphics g) { 
     g.clearRect(0, 0, getWidth(), getHeight()); 
     g.setColor(Color.RED); 
     if (origin != null) { 

      int tmp; 

      int x1 = (int) (origin.getX()); 
      int y1 = (int) (origin.getY()); 
      int x2 = (int) (end.getX()); 
      int y2 = (int) (end.getY()); 

      if (x1 > x2) { 
       tmp = x1; 
       x1 = x2; 
       x2 = tmp; 
      } 
      if (y1 > y2) { 
       tmp = y1; 
       y1 = y2; 
       y2 = tmp; 
      } 

      g.drawRect(x1, y1, x2 - x1, y2 - y1); 
     } 

    } 

} 

感谢您的时间伙计。

+1

不要重写'paint',改用'paintComponent',并确保在执行任何自定义绘画之前调用'super.paintComponent',你会发现它会产生更少的问题 – MadProgrammer

+1

我不明白'mouseRelease'事件的目的。 'origin'和'end'已经设置好了,如果你打电话给'repaint',无论如何都会画出矩形 – MadProgrammer

回答

1

我试图打开一个图像,画上有一个长方形

第一矩形上漆后,我想,如果我画的第二个它仍然可见。

保留矩形的ArrayList进行绘制。然后在组件的paintComponent()方法中显示图像,您可以遍历列表来绘制矩形。

查看DrawOnComponet来自Custom Painting Approaches的示例,以便开始您的工作示例。

该示例只是绘制矩形,因此您还需要绘制图像。或者你可以扩展JLabel,所以标签绘制图像,然后你画出矩形。

+0

我明白你的意思了,但是当我添加图像时,我看不到矩形I画画。我怎么能解决这个问题? –

+0

您不会将图像“添加”到面板。您可以在面板的相同paintComponent()方法中绘制图像和矩形。因此,您先绘制图像,然后绘制矩形,然后绘制图像的顶部 – camickr