2017-12-02 11 views
-1

マウスをドラッグしている間に画像を開き、マウスのドラッグした状態で矩形を描画し、マウスがリリースされます。Java、Swing、Awt - 画像上に矩形を描画して可視にします。

私はドラッグ中に矩形を描画することに成功しましたが、矩形を描画してデータを保存するために、最終点の座標を収集することができません。コードを改善するためのアイデアはありますか?

私はmousReleasedイベントが助けになると思いますが、私はどのように使用すべきか分かりません。

編集:最初の矩形をペイントした後、2番目の矩形を描画すると、そのペイントが表示されたままになります。

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()メソッドで、リストを反復して長方形を描画します。

Custom Painting ApproachesDrawOnComponetの例をご覧ください。

この例では矩形を描画しているだけなので、イメージを描画する必要もあります。または、JLabelを拡張すると、ラベルが画像を塗りつぶした後、矩形を描画するだけです。

+0

私はあなたのポイントを感謝しますが、イメージを追加すると、私は長方形を見ることができません。 'mの図面。どうすればそれを修正できますか? –

+0

イメージをパネルに「追加」しません。パネルの同じpaintComponent()メソッドでイメージと四角形を描画します。そのため、まず画像を描画し、次にその画像の上にペイントするように矩形を描画します – camickr

関連する問題