gpt4 book ai didi

Java - 为什么这个小程序的背景没有显示为浅蓝色(青色)?

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

此代码来自 Lewis Loftus 编写的 Java 教科书。它显示了教科书中的示例输出,背景为浅蓝色(青色)。我认为有问题:

setBackground(Color.cyan);

这是整个程序:

import javax.swing.JApplet;
import java.awt.*;

public class Snowman extends JApplet
{
//-----------------------------------------------------------------
// Draws a snowman.
//-----------------------------------------------------------------
public void paint(Graphics page)
{
final int MID = 150;
final int TOP = 50;

setBackground(Color.cyan);

page.setColor(Color.blue);
page.fillRect(0, 175, 300, 50); // ground

page.setColor(Color.yellow);
page.fillOval(-40, -40, 80, 80); // sun

page.setColor(Color.white);
page.fillOval(MID-20, TOP, 40, 40); // head

page.fillOval(MID-35, TOP+35, 70, 50); // upper torso
page.fillOval(MID-50, TOP+80, 100, 60); // lower torso

page.setColor(Color.black);
page.fillOval(MID-10, TOP+10, 5, 5); // left eye
page.fillOval(MID+5, TOP+10, 5, 5); // right eye

page.drawArc(MID-10, TOP+20, 20, 10, 190, 160); // smile

page.drawLine(MID-25, TOP+60, MID-50, TOP+40); // left arm
page.drawLine(MID+25, TOP+60, MID+55, TOP+60); // right arm

page.drawLine(MID-20, TOP+5, MID+20, TOP+5); // brim of hat
page.fillRect(MID-15, TOP-20, 30, 25); // top of hat

}
}

最佳答案

切勿尝试在顶级组件中绘制。相反,创建一个扩展 JPanel 的类,重写其 paintComponent 方法,确保在重写中调用 super 的 paintComponent,然后将 JPanel 添加到 JApplet 的 contentPane 中。另外,请在 JPanel 的构造函数中设置 JPanel 的背景,而不是在其 Paint 或 PaintComponent 方法中。

此外,在以后的问题中,请尝试将代码缩进合理且一致的量。良好的代码格式使代码更易于阅读,更重要的是,更易于理解。

例如,

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.*;

@SuppressWarnings("serial")
public class SnowManPanel extends JPanel {
private static final Color BACKGROUND = Color.CYAN;
private static final int MID = 150;
private static final int TOP = 50;
private static final int PREF_W = 300;
private static final int PREF_H = 225;

public SnowManPanel() {
setBackground(BACKGROUND);
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.blue);
g.fillRect(0, 175, PREF_W, PREF_H - 175); // ground

g.setColor(Color.yellow);
g.fillOval(-40, -40, 80, 80); // sun

g.setColor(Color.white);
g.fillOval(MID-20, TOP, 40, 40); // head

g.fillOval(MID-35, TOP+35, 70, 50); // upper torso
g.fillOval(MID-50, TOP+80, 100, 60); // lower torso

g.setColor(Color.black);
g.fillOval(MID-10, TOP+10, 5, 5); // left eye
g.fillOval(MID+5, TOP+10, 5, 5); // right eye

g.drawArc(MID-10, TOP+20, 20, 10, 190, 160); // smile

g.drawLine(MID-25, TOP+60, MID-50, TOP+40); // left arm
g.drawLine(MID+25, TOP+60, MID+55, TOP+60); // right arm

g.drawLine(MID-20, TOP+5, MID+20, TOP+5); // brim of hat
g.fillRect(MID-15, TOP-20, 30, 25); // top of hat
}

@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}

private static void createAndShowGui() {
SnowManPanel mainPanel = new SnowManPanel();

JFrame frame = new JFrame("SnowManPanel");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

请注意,顶级窗口(例如 JApplet 和 JFrame)有点复杂,并且具有多个角色和多个层。一个问题是您的程序尝试直接在 JApplet 的 Paint 方法中进行绘制,而忽略了小程序的背景是由另一层(即其 contentPane)绘制的,这是一个包含小程序所有内容的 JPanel。如果不调用 super.paint(...) 方法,它还有可能破坏小程序的绘画链——因为小程序自己的绘画(通过 super.paint(...) 调用)最终会被破坏。负责绘制所有小程序,包括其边框及其子组件。

关于Java - 为什么这个小程序的背景没有显示为浅蓝色(青色)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29337202/

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