2016-05-08 8 views
1

私は、MouseListenersを使って線を描画し、paintComponentメソッドをオーバーライドしようとしています。私は自分のpaintComponentをパネル上に描画するように設定しました。しかし、今はパネルをクリックしてマウスを別のポイントにドラッグして線を作成するように変更する必要があります。私はこれらのチュートリアルをすべて読んできましたが、私はまだかなり失われています。私を導くことができる人は誰ですか?マウスリスナーメソッドにJPanelで線をドラッグして描画する方法は?

package gui; 

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.Shape; 
import java.awt.geom.Line2D; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class DrawPanel extends JPanel { 

    private static final long serialVersionUID = 1697489704611349844L; 

    /** The width of the panel. */ 
    private static final int WIDTH = 600; 

    /** The height of the panel. */ 
    private static final int HEIGHT = 300; 

    /** The stroke width in pixels. */ 
    private static final int STROKE_WIDTH = 1; 

    /** The width for the rectangle. */ 
    private static final int RECTANGLE_WIDTH = 50; 

    /** The height for the rectangle. */ 
    private static final int RECTANGLE_HEIGHT = 50; 

    public DrawPanel() { 
     super(); 
     setBackground(Color.WHITE); 
     setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
    } 

class LineListener implements MouseListener, MouseMotionListener { 
    @Override 
    public void mouseClicked(MouseEvent theEvent) { 
     theX = theEvent.getX(); 
     theY = theEvent.getY(); 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseDragged(MouseEvent theEvent) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseMoved(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 


    @Override 
    public void paintComponent(final Graphics theGraphics) { 
     super.paintComponent(theGraphics); 
     final Graphics2D g2d = (Graphics2D) theGraphics; 

    // for better graphics display 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
         RenderingHints.VALUE_ANTIALIAS_ON); 

     final Shape line = new Line2D.Double(10, 10, 100, 100); 
     g2d.setPaint(Color.ORANGE); 
     g2d.setStroke(new BasicStroke(STROKE_WIDTH)); 
     g2d.draw(line); 
    } 


    public static void main(final String[] theArgs) { 
     final DrawPanel panel = new DrawPanel(); 
     final JFrame frame = new JFrame("Drawing Panel Demo"); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setLocationRelativeTo(null); 
    } 


} 

答えて

0

ルック:

これは、これまでのところ、私のコードです。クリックまたはドラッグされたポイントのリストを格納するマウスリスナーが必要になります。 paintComponent()では、現在描画しているのと同じ方法でそれらの点を描画できます。マウスリスナーの

レッスン:http://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html

2

あなたのラインパラメータ、10、10、100、100ハードコーディングしている:非常に柔軟性のない構造のために作る

final Shape line = new Line2D.Double(10, 10, 100, 100); 

を - 方法はありませんユーザーがクリックしてドラッグすると、コードがこれを変更できます。解決策は、ハードコードされた「マジック」番号を使用する代わりに、コードのMouseListenerで変更されたint変数を使用する代わりに、これを行うことではありません。同じMouseListenerの内部では、パラメータの値を変更した後にrepaint()を呼び出すと、GUIを再描画するようにJVMに提案し、paintComponentメソッドを再呼び出しします。

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.RenderingHints; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class DrawPanel2 extends JPanel { 
    private static final int PREF_W = 600; 
    private static final int PREF_H = 300; 
    private static final Color BG = Color.WHITE; 

    // create fields that can be set in your mouse listeners 
    // and used in the painting methods 
    private Point p1 = null; 
    private Point p2 = null; 

    public DrawPanel2() { 
     setBackground(BG); 

     // create your mouse adapter and add as mouse and mouse motion listeners 
     MyMouse myMouse = new MyMouse(); 
     addMouseListener(myMouse); 
     addMouseMotionListener(myMouse); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     // if your points have been set,.... draw them! 
     if (p1 != null && p2 != null) { 
      int x1 = p1.x; 
      int y1 = p1.y; 
      int x2 = p2.x; 
      int y2 = p2.y; 

      g2.drawLine(x1, y1, x2, y2); 
     } 
    } 

    // to set the size of the GUI 
    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    // my mouse adapter inner class 
    private class MyMouse extends MouseAdapter { 
     @Override 
     public void mousePressed(MouseEvent e) { 
      p1 = e.getPoint(); 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      p2 = e.getPoint(); 
      repaint(); 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      p2 = e.getPoint(); 
      repaint(); 
     } 
    } 

    private static void createAndShowGui() { 
     DrawPanel2 mainPanel = new DrawPanel2(); 

     JFrame frame = new JFrame("Draw Panel 2"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

あなたの投稿コードについて:

  • あなたの内部クラスは、MouseAdapterのを拡張しました。このクラスはすでにMouseListenerとMouseMotionListenerとホイールリスナーを実装しており、変更するメソッドをオーバーライドするだけで済みます。
  • 最新のコードは、どこでも宣言されていないXとYの2つのフィールドを使用しようとするため、コンパイルしないでください。私はそれがちょうどあなたの部分にちょっと投稿していることを推測しています。あなたが最初にコンパイルしようとすることなく、このコードをすぐにあなたの質問に投げたことです。しないでください。私たちは自由な時間を助けようとしているボランティアです。あなたがこれをやることは、助けをより困難にするだけです。
  • 2つのポイントフィールド(上記のように)またはxとy intフィールドの2つのセット、たとえばx1、y1、x2、y2を使用し、マウスリスナーコードでこれらを設定する必要があります。
  • 単純なプログラムのmouseDraggedとmouseReleasedは同じで、2番目のPoint(上の例のように)またはxとyの2番目のintフィールドを設定し、repaintを呼び出すだけで済みます。
  • paintComponentメソッドは、Point値(上記の例のように)またはxとy intフィールドの両方のペアを使用して線を描画します。
+0

ええ私はちょうど線の描画がどのように動作するかを知るために、数値を目的に合わせてハードコードしました。私の問題は、MouseListenersの実装方法を理解することです。 – Jasmine

+0

@ジャスミン:質問自体の問題を解決しようとする試みが示されていないので、あなたの質問は改善されるはずです。常にあなたの試みを投稿してください。そうしないと、あなたを助ける方法がわかりません。つまり、将来、マウスリスナーに関する質問があれば、マウスリスナーで何をしようとしているのかを示す必要があります。 –

+0

これは私の問題です。私はこれにアプローチする方法を理解していないので、実際には何の試みもありません。私が知っている唯一のことは、MouseListenerメソッド内で自分のポイントを取得しgetYする必要があることですが、それだけです。 – Jasmine

関連する問題