2011-11-10 27 views
0
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.event.*; 
import java.awt.geom.*; 
import java.util.*; 

public class test extends JFrame implements ActionListener, MouseListener { 

    private Vector<String> vlist = new Vector<String>(); 
    private int mouseX, mouseY; 
    Canvas c = new Canvas(); 

    public test() { 
     setSize(400,400); 
     addMouseListener(this); 

    } 

    public static void main(String[] args) { 


     java.awt.EventQueue.invokeLater(new Runnable() { 
       public void run() { 
        test frame = new test(); 
        //frame.setBackground(Color.yellow); 
        frame.setVisible(true); 
       } 
     }); 
    } 

    public void actionPerformed(ActionEvent ae) { 

    } 

    @Override 
    public void paint(Graphics g) { 

     Shape circle = new Ellipse2D.Float(100f, 100f, 100f, 100f); 
     Graphics2D ga = (Graphics2D)g; 
     ga.draw(circle); 

    } 

    public void move() { 

    } 

    public void drawCircle(int x, int y) { 

    } 

    public void mouseClicked(MouseEvent e) { 
     repaint(); 

    } 

    public void mouseExited(MouseEvent e) { 

    } 

    public void mousePressed(MouseEvent e) { 
     this.mouseX=e.getX(); 
     this.mouseY=e.getY(); 
    } 

    public void mouseReleased(MouseEvent e) { 

    } 

    public void mouseEntered(MouseEvent e) { 

    } 
} 

私は、Javaでグラフィックプログラミングを学ぶためのテストプログラムを書きたいと思っています。上記のコードを実行するには、円が自動的に描画されます。なぜpaint()メソッドが自動的に実行されるのですか?私はマウスをクリックしたときに作成される円です。java paint()は自動的に実行されますか?

+1

その他の具体的なアドバイスに加えて、1)Swingコンポーネント(例: 'JFrame')とAWT(例:' Canvas')を混在させないでください。 2) 'setSize(400,400);'カスタムレンダリングコンポーネントの参照されるサイズを設定し、 'pack()'がフレームに追加された後に 'pack()'を呼び出します。 3)同期が必要ない場合、 'Vector'ではなく' ArrayList'を使います。 –

答えて

1

クラスに属性を追加します。

boolean draw; 

これはdrawがtrueの場合にのみ、プログラムを描くようになります

if (draw) { 
    // existing code 
} 

paint(...)でコードを囲みます。最初は、それは何も描画しないので偽です。マウスをクリックすると、値属性drawになります。

public void mouseClicked(MouseEvent e) { 
    draw = true; 
    repaint(); 
} 
+0

素晴らしいです!ありがとう – hkguile

1

スイングペイントマネージャは、JFrameがレンダリングされるときにpaintメソッドを呼び出します。これの内部動作の詳細については、Painting in AWT and Swingを参照してください。あなたのプログラムを改善するために

、あなたはJPanelのかのJComponentから継承する他のコンポーネントに図面を行い

  • したいと思うでしょう。
  • paintメソッドではなく、JPanelのpaintComponentメソッドで実際のペインティングを行います。
  • 最初にsuper.paintComponent()メソッドを呼び出します。
  • マウスクリックで円を描きたい場合は、paintComponentメソッドにifブロックを追加して、クラスフィールドbooleanがtrueの場合にのみ円を描画し、MouseListenerでtrueを設定してrepaintを呼び出します。
  • 最も重要なのは、スイングのグラフィックスを行う方法に関するチュートリアルを読んでください(このスレッドでTomの答えが示すとおり)。
0

カスタムペイントを行うには、JFrameのpaint()メソッドをオーバーライドしないでください。

JPanelまたはJComponentのpaintComponent()メソッドをオーバーライドし、そのコンポーネントをJFrameに追加する必要があります。

基本についてはCustom PaintingのSwing tutoriaをご覧ください。

詳細については、Painting in AWT and Swingをご覧ください。

関連する問題