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

您已经习惯了 applet,其中覆盖paint实际上会起作用。在 aJFrame中,推荐的技术稍微复杂一些。将此代码添加到您的构造函数:

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 回答