私は以下のプログラムを持っています。緑色の地面に赤い文字を印刷することになっています。プログラムが開くと、緑色の背景だけが表示されますが、赤色のテキストは表示されません。ウィンドウのサイズが変更され、これが再計算されると、赤いテキストが表示されます。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();
}
}
まず、 'paint'ではなく' paintComponent'を上書きする必要があります。そして私は個人的に 'JFrame'の代わりに' JPanel'を拡張することを勧めます。スウィングのロジックでは、通常、コンテナは必要なときに(つまり、ウィンドウのサイズを変更するときに)再描画されるだけなので、 'repaint'への呼び出しを制御する方法も必要です。 – Gorbles