我正在学习一个教程,输出窗口打印出"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();
}
}
Run Code Online (Sandbox Code Playgroud)
在教程中,它通常打印带有"Hello World!"的窗口.但是当我运行相同的代码时,会出现这种可怕的输出.这种输出怎么出现?为什么?代码中有问题吗?
这是一个Swing GUI,发布的类扩展了JFrame并覆盖了paint方法(你不应该这样做).
要回答您的问题,只要呈现组件,JVM就会自动调用所有Swing组件的paint方法重写.应用程序启动时,如果组件可见,调整大小时以及操作系统认为组件窗口"脏"并需要重新绘制时,将呈现组件.
如果您建议通过调用repaint()组件或在其层次结构中位于其上方的任何容器上重新绘制组件,也可以绘制该组件.请注意,我说"建议",因为您只能要求重绘管理器绘制组件,但通常不"要求"它这样做,因此如果重新绘制请求堆栈,您可以给重绘管理器选择不重新绘制区域起来.
因此,这意味着paint方法永远不会受到您的直接控制,并且可以多次调用或不经常调用.
这段代码不是很好的代码的原因是:
super.paint(g)方法,因此您将覆盖JFrame的绘制方法,而不会告诉它执行正常绘制.总而言之,除非你非常确定你正在做什么(你的视频的作者不是)并且知道所涉及的风险,否则不要覆盖JFrame的paint方法.要正确绘制,请查看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();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)