0

チュートリアルに従っていますが、出力ウィンドウに「Hello World!」と表示されます。そこの。私の質問は、paint()メソッドがどこからも呼び出されない場合、どのように「Hello World!」を出力するかということです。?

ここにコードがあります..

package javagame;

import java.awt.Graphics;

import javax.swing.JFrame;


public class JavaGame extends JFrame{

    public JavaGame(){

        setTitle("sadid java game");    
        setSize(500, 500);
        setResizable(false);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    }

    public void paint(Graphics g){
        g.drawString("Hello world !!!!",30,30);
    }

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

    }

}

チュートリアルでは、ウィンドウに「Hello World!」と表示されます。しかし、同じコードを実行すると、この恐ろしい出力が表示されます。この種の出力はどのように表示され、その理由は? コードに問題はありますか..?

4

2 に答える 2

5

これは 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();
         }
      });
   }
}
于 2013-10-02T21:13:29.203 に答える