2017-05-30 2 views
0

私は、paint()メソッドが、JFrameにクラスを拡張するときなど、必要に応じて呼び出されることが何度も言われています。コードではpaintメソッドが呼び出されていないので、描画された矩形は表示されません。Javaの方法とタイミングは正確にはpaint()メソッドですか?

私も(私が作成した)コンストラクタの内部でpaintメソッドを呼び出そうとしましたし、メインでクラスのobejctを作成するが、私はあなたが二つのフレーム持っているとNullPointerException

import java.awt.Graphics; 
import javax.swing.JFrame; 

public class MyFirstDrawing extends JFrame 
{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    public static void main(String args[]) 
    { 
     JFrame w = new JFrame("Hello World"); 
     w.setTitle("My First Drawing"); 
     w.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     w.setSize(500,500); 
     w.setVisible(true); 
    } 
    public void paint(Graphics g) 
    { 
     g.drawRect(40, 40, 100, 200); 
    } 
} 
+3

「MyFirstDrawing」ではなく、新しい「JFrame」を作成しました。 – GriffeyDog

+0

実際に私もそれをしましたが、出力に何も起こらなかったので、私はその行を削除しました。また、私は初心者ですので、私はそのオブジェクトで何をすべきか分かりませんでした。 –

+1

JFrame上でpaint()をオーバーライドしないでください! – camickr

答えて

2

を得た:

  1. JFrameを拡張してpaint()メソッドをオーバーライドしますが、paint()メソッドが呼び出されないようにそのフレームが表示されることはありません。

  2. 次に、表示する新しいJFrameを作成しますが、このフレームにはカスタムペイントがないため、フレームが表示されます。

いずれにしても、これはカスタムペイントを行う方法ではありません。カスタムペイントは、JPanelのpaintCompnent(...)をオーバーライドして、フレームをパネルに追加することによって行われます。カスタマイズ可能な詳細と作業例については、Custom PaintingのSwingチュートリアルのセクションを読んでください。

このチュートリアルの例では、クラスを作成してJFrameを拡張する必要がないようにする方法を示します。チュートリアルの例に従ってください。

+1

'paintComponent()'メソッドをオーバーライドするときに 'super.paintComponent(g)'を呼び出すことは実際には本当に重要なことです。それ以外の場合は、予測できない絵が発生する可能性があります – CraigR8806

+0

私は間違いなく例を見て回りますが、何が回避策になるのでしょうか?1.絵を表示するためにフレームを表示させ、2.描画したJFrameを使用します私の絵。 –

+1

'本当に重要なのは、' - yesのときにsuper.paintComponent(g)を呼び出すことが本当に重要だということです。私の提案はチュートリアルにある実際の例から始めることです。 – camickr

関連する問題