2016-04-25 10 views
0

私は以下のプログラムを持っています。緑色の地面に赤い文字を印刷することになっています。プログラムが開くと、緑色の背景だけが表示されますが、赤色のテキストは表示されません。ウィンドウのサイズが変更され、これが再計算されると、赤いテキストが表示されます。Java swing.JFrameはウィンドウのサイズ変更時に内容をペイントします

ウィンドウ内でJPanelを使用してそこにコンポーネントを追加すると正しく動作します。色がpaintComponentに設定されていれば、すべて正常に動作します。

私はJFrameを直接描画するとどこに問題がありますか?私は最初の "更新"や何かを見逃していますか?ウィンドウの最初の描画(追加のテキスト)に欠落している情報があるように見えます。その情報は、ウィンドウが再計算されて再描画されたときにのみ認識されます。

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

public class PaintAWT extends JFrame { 

    PaintAWT() { 
     this.setSize(600, 400); 
     this.setLocationRelativeTo(null); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setVisible(true); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 

     // Set background color: 
     // If you don't paint the background, one can see the red text. 
     // If I use setBackground I only see a green window, until it is 
     // resized, then the red text appears on green ground 
     this.getContentPane().setBackground(new Color(0,255,0)); 

     // Set color of text 
     g.setColor(new Color(255,0,0)); 

     // Paint string 
     g.drawString("Test", 50, 50); 
    } 

    public static void main(String[] args) { 
     new PaintAWT(); 
    } 

} 
+1

まず、 'paint'ではなく' paintComponent'を上書きする必要があります。そして私は個人的に 'JFrame'の代わりに' JPanel'を拡張することを勧めます。スウィングのロジックでは、通常、コンテナは必要なときに(つまり、ウィンドウのサイズを変更するときに)再描画されるだけなので、 'repaint'への呼び出しを制御する方法も必要です。 – Gorbles

答えて

4

塗装方法でコンポーネントのプロパティを設定しないでください。塗装方法は塗装のみです。 setBackground()は使用しないでください。

フレームを作成するときにコンテンツペインの背景を設定する必要があります。

カスタムペイントを行うときは、getPreferredSize()メソッドをオーバーライドしてコンポーネントのサイズを返す必要があります。

また、JFrameを拡張しないでください。クラスに機能を追加するときにのみ、クラスを拡張します。

詳細については、Custom PaintingのSwingチュートリアルのセクションを読んで始めてください。この例では、スイング規則に従ってコードをよりよく構築する方法を示します。

2

setBackgroundをコンストラクタに移動する必要があります。ペイント方法の背景の設定は悪いアプローチです。

import java.awt.Color; 
import java.awt.Graphics; 

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class PaintAWT extends JFrame { 

    PaintAWT() { 
     this.setSize(600, 400); 
     this.setLocationRelativeTo(null); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     // Set background color: 
     // If you don't paint the background, one can see the red text. 
     // If I use setBackground I only see a green window, until it is 
     // resized, then the red text appears on green ground 
     this.getContentPane().setBackground(new Color(0,255,0)); 
     this.setVisible(true); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 


     // Set color of text 
     g.setColor(new Color(255,0,0)); 

     // Paint string 
     g.drawString("Test", 50, 50); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new PaintAWT(); 
      } 
     }); 
    } 

} 
+1

カスタムペイントを行うためにJFrameを拡張しないでください。 paint()をオーバーライドするべきではありません。 – camickr

+0

背景色を変更するのはどうですか?私がpaintメソッドの代わりにコンストラクタに置くと、固定されていますか? – Fuzzzzel

関連する問題