为什么我的图形后JFrame是空的

时间:2013-08-04 07:47:27

标签: java swing jframe paint drawstring

为什么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 ();
   }
}

3 个答案:

答案 0 :(得分:3)

您习惯于applet,其中覆盖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非常重要。

您应该知道的其他几件事与applet不同:

  • 您需要致电setVisible(true)以显示相框。这是您的程序必须使用的。
  • 如果您希望在窗口关闭时关闭程序,则应添加setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)。强烈推荐。

答案 1 :(得分:1)

当你打开一个新框架时,你应该在validatepack应用它之后使其显示,并在框架创建结束时调用setVisible(true)。修改代码:

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

答案 2 :(得分:1)

1)遵循java代码约定javaGame应为JavaGame

2)Swing程序应覆盖paintComponent()而不是覆盖paint()

3)您应该在JPanel等JComponent中进行自定义绘制。

将您的代码更改为例如此类。

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();
            }
        });
    }
}