2017-12-02 392 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