これは Swing GUI です。投稿されたクラスは JFrame を拡張し、ペイント メソッドをオーバーライドします (これを行うべきではありません)。
あなたの質問に答えるために、すべての Swing コンポーネントのペイント メソッド オーバーライドは、コンポーネントがレンダリングされるたびに JVM によって自動的に呼び出されます。コンポーネントは、アプリケーションの起動時、コンポーネントが表示されている場合、サイズが変更されたとき、およびコンポーネントを含むウィンドウが「汚れている」ため再描画が必要であるとオペレーティング システムが判断したときにレンダリングされます。
コンポーネントまたはその階層内の上位のコンテナーを呼び出して再描画することを提案した場合、コンポーネントを描画することもできます。repaint()
再描画マネージャーにコンポーネントの描画を要求することはできますが、通常はそうするように「要求」することはできないため、「推奨」と言っていることに注意してください。上。
したがって、これは paint メソッドが直接制御されることはなく、何度もまたはまれに呼び出される可能性があることを意味します。
このコードが従うのに適していない理由は、次のとおりです。
- 彼らのペイントの例は
super.paint(g)
メソッドを呼び出さないため、通常のペイントを行うように指示せずに JFrame のペイント メソッドをオーバーライドしています。
- paint メソッドは、コンポーネントの子と境界線の描画を担当します。JFrame の場合、これは非常に重要です。スーパー メソッドを呼び出さないと、JFrame のこれらの部分がめちゃくちゃになる危険があります。
- ペイント メソッドは、デフォルトではダブル バッファリングを実行しません。これを使用してアニメーションを実行しようとすると、手動でダブル バッファリングしない限り、アニメーションが途切れ途切れになることが保証されます。
つまり、自分が何をしているのか (ビデオの作成者はそうではありませんでした) に確信が持てず、関連するリスクを認識していない限り、JFrame のペイント メソッドをオーバーライドしないでください。正しく描画するには、公式のPaint in Swing Tutorialsを確認し、その例に従ってください。より詳細な説明については、 AWT と Swing でのペイント を参照してください。
チュートリアルが表示しようとしているもののより良い例は次のとおりです。
import java.awt.*;
import javax.swing.*;
// draw in a JPanel, not in a JFrame
public class JavaGame2 extends JPanel {
private static final int PREF_W = 500;
private static final int PREF_H = PREF_W;
public JavaGame2() {
}
// draw within the JPanel's paintComponent method
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // be sure to first call the super's method
g.drawString("Hello world !!!!", 30, 30);
};
// better to set size this way
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
private static void createAndShowGui() {
JavaGame2 mainPanel = new JavaGame2();
// no need to extend JFrame. Instead just use one when needed
JFrame frame = new JFrame("sadid java game");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
// be sure to start your Swing GUI in a thread-safe way
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}