2017-03-28 22 views
1

マウスをクリックしたときに楕円をJPanelに描画しようとしています。私のコードはpaintComponentを呼び出さないので、JPanelでは何も起こりません。どの部分が欠けているの?JPanelで楕円を描くことができません

public class Main extends JFrame implements MouseListener{ 
     JPanel thePanel = new JPanel(){ 
      @Override 
      protected void paintComponent(Graphics g) 
       { 
        super.paintComponent(g); 
       g.setColor(Color.red); 
       for (Circle c : circles){ 
         g.fillOval(c.x, c.y, c.diameter, c.diameter); 
         System.out.println(c.x + "a"); 
       } 

       } 
     }; 
     JFrame frame=new JFrame(); 
     int x,y; 
     ArrayList<Circle >circles = new ArrayList<Circle>(); 
     public static void main(String[] args) { 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        new Main(); 
       } 
      }); 
     } 
    public Main(){ 

     frame.setSize(512,512); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.addMouseListener(this); 
     frame.add(thePanel); 
     frame.setVisible(true); 

    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
      System.out.println(e.getX()); 
      Circle c = new Circle(); 
      c.x=e.getX(); 
      c.y=e.getY(); 
      c.diameter=10; 
      circles.add(c); 
      repaint(); 
    } 

円クラス

class Circle 
    { 
     public int x, y, diameter; 
    } 

私はゲッターとセッターを使用していませんでしたが、私はそれが問題だとは思いません。

+0

を幅と高さをドラッグ。 'repaint()'の代わりに 'thePanel.repaint()'を試してみてください。 – khelwood

+0

私はこの質問がここで尋ねられた同じ問題の**重複**だと思う:http://stackoverflow.com/questions/35299786/draw-circle-on-jpanel-after-mouse-click/35300018 – onlyhuman

+1

'public class MainはJFrameを拡張しています.'' 1) 'Main'は非常に意味のない(したがって役に立たない)名前です。それを意味のあるものにする。 'OvalGUI'のようなものはもっと説明的です。 2)「JFrame」を拡張する必要はありません:A)GUIがGUIを作成します。 B) 'JFrame'クラスのメソッドはオーバーライドされません。 –

答えて

3

repaint()thePanel.repaint()に変更すると、追加されているサークルを確認できるはずです。

フレームのマウスリスナーからフレーム座標を取得しているが、パネル座標でペイントしようとしているため、少しオフ位置に表示されます。

編集:new JFrame()によってインスタンス1、およびnew Main()によってインスタンス1:camickrは彼のコメントで指摘したように
、あなたは実際に2 JFrame秒を持っています。これはあなたのrepaintが望む効果を持っていなかった理由です:repaintを呼び出していたものが、あなたが見ていたものではありませんでした。 camickrは、MainJFrameから継承していないことを示唆しています。これは良いアドバイスです。

+0

まあ、私はJavaのGUIでクールではない、それはkhelwood、ありがとう、働いた。 –

+0

(1-) 'あなたのフレームでrepaint()を呼び出すと必ずパネルのペイントがトリガされるわけではありません。 - フレームのrepaint()はフレームのすべての子コンポーネントを再ペイントします。 – camickr

+0

@camickrあなたは大丈夫です。私は答える前に近くを見ていたはずです。 – khelwood

0

は楕円描画し、あなたのパネルが再描画取得されていないマウスで

import java.applet.Applet; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.awt.Point; 

public class DrawOval extends Applet implementsMouseListener,MouseMotionListener { 

    private int xstart,xend,ystart,yend; 
    private boolean flag=false; 
    private int width,heigth; 
    private Point clickPoint; 
    private Point dragPoint; 
    private int x,y; 

    public void init() { 
     this.addMouseListener(this); 
     this.addMouseMotionListener(this); 
    } 

    public void paint(Graphics p) { 
     if (flag) { 
      p.drawOval(x, y, width, heigth); 
     } 
    } 

    @Override 
    public void mouseClicked(MouseEvent me) { 

    } 

    @Override 
    public void mousePressed(MouseEvent me) { 
     clickPoint = me.getPoint(); 
    } 

    @Override 
    public void mouseReleased(MouseEvent me) { 
    } 

    @Override 
    public void mouseEntered(MouseEvent me) { 
    } 

    @Override 
    public void mouseExited(MouseEvent me) { 
    } 

    @Override 
    public void mouseDragged(MouseEvent me) { 
     dragPoint = me.getPoint(); 
     x = Math.min(clickPoint.x, dragPoint.x); 
     y = Math.min(clickPoint.y, dragPoint.y); 
     width = Math.max(clickPoint.x, dragPoint.x) - x; 
     heigth = Math.max(clickPoint.y, dragPoint.y) - y; 

     flag = true; 
     repaint(); 
    } 

    @Override 
    public void mouseMoved(MouseEvent me) { 

    } 
}