为什么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 ();
}
}
答案 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)
当你打开一个新框架时,你应该在validate
或pack
应用它之后使其显示,并在框架创建结束时调用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();
}
});
}
}