4

JFrameグラフィックの後に が空である理由

package javaGame;

import java.awt.Graphics;

import javax.swing.JFrame;


public class javaGame extends JFrame {

   public javaGame (){
       setVisible(true);
       setSize(250,250);
       setResizable(false);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setTitle("Java Game");
   }

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

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

3 に答える 3

3

オーバーライドpaintが実際に機能するアプレットに慣れています。ではJFrame、推奨される手法はもう少し複雑です。このコードをコンストラクターに追加します。

getContentPane().add(new JPanel() {
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString("Hello world!", 75, 75);
    }
});

JPanelこれにより、ペイントを行うためにオーバーライドされる匿名のサブクラスが作成され、フレームpaintComponentに が追加JPanelされます。への呼びかけsuper.paintComponentは重要です。

アプレットとは異なる点を知っておく必要があります。

  • setVisible(true)フレームを表示するには、呼び出す必要があります。これは、プログラムが機能するために必須です。
  • setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)ウィンドウが閉じられた場合にプログラムを閉じる場合は、追加する必要があります。強くお勧めします。
于 2013-08-04T07:50:06.383 に答える
1

新しいフレームを開くときは、validateまたはpackが適用された後に表示する必要があります。またsetVisible(true)、フレーム作成の最後に呼び出します。変更のコード:

public void paint (Graphics g){
   super.paint(g);
   g.drawString("Hello world!", 75, 75);
}
于 2013-08-04T07:51:32.547 に答える
1

1) Java コードの規則に従うjavaGame必要があります。JavaGame

2) Swing プログラムは、 PaintComponent() をオーバーライドする代わりにオーバーライドする必要がありますpaint()

3) のような JComponent でカスタム ペイントを作成する必要がありますJPanel

コードをたとえば次のように変更します。

public class JavaGame {

    private JFrame frame; //use composition instead of concrete inheritance

    public JavaGame () {
        jframe.setSize(250,250);
        jframe.setResizable(false);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jframe.setTitle("Java Game");
        jframe.add(new JPanel() {
            @Override
            public void paintComponent (Graphics g) {
                super.paintComponent(g);
                g.drawString("Hello world!", 75, 75);
            }
        });
        jframe.pack(); //sizes the frame
        jframe.setVisible(true);
    }

    public static void main (String[] args) {
        SwingUTilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new javaGame();
            }
        });
    }
}
于 2013-08-04T09:16:06.913 に答える