gpt4 book ai didi

java - 为什么会出现这样的输出呢?

转载 作者:行者123 更新时间:2023-12-01 17:20:31 25 4
gpt4 key购买 nike

我正在遵循教程,输出窗口打印“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();

}

}

在本教程中,它通常会打印带有“Hello World!”的窗口。但是当我运行相同的代码时,这太可怕了 output出现。这种输出是如何出现的以及为什么会出现?代码有问题吗?

最佳答案

这是一个 Swing GUI,发布的类扩展了 JFrame 并覆盖了 Paint 方法(您不应该这样做)。

为了回答您的问题,每当渲染组件时,JVM 都会自动调用所有 Swing 组件的 Paint 方法重写。当应用程序启动时、如果组件可见、调整其大小时以及操作系统认为包含该组件的窗口“脏”并需要重新绘制时,都会呈现该组件。

如果您建议通过在组件或其层次结构中位于其上方的任何容器上调用repaint()来重新绘制该组件,也可以绘制该组件。请注意,我说“建议”是因为您只能要求重绘管理器绘制组件,但通常不会“要求”它这样做,因此您可以为重绘管理器提供在重绘请求堆栈时不重绘区域的选项向上。

所以这意味着paint方法永远不会受到您的直接控制,并且可以多次或不频繁地调用。

这段代码不是好代码的原因是:

  • 他们的绘制示例不会调用 super.paint(g) 方法,因此您将重写 JFrame 的绘制方法,而不告诉它执行正常的绘制。
  • paint 方法负责绘制组件的子组件和边框,对于 JFrame 来说这是非常重要的。如果不调用 super 方法,您可能会冒着彻底搞乱 JFrame 的这些部分的风险。
  • 默认情况下,paint 方法不会进行双缓冲,如果您尝试使用它来制作动画,除非您手动进行双缓冲,否则肯定会出现断断续续的动画。

总之,不要重写 JFrame 的绘制方法,除非您非常确定自己在做什么(您的视频的作者不是)并且知道所涉及的风险。正确绘制请查看官方Painting in Swing Tutorials ,并遵循他们的例子。更详细的解释请阅读Painting in AWT and 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();
}
});
}
}

关于java - 为什么会出现这样的输出呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19146869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com