setBackground语句无效?

3
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);
    page.fillOval(MID+5, TOP+10, 5, 5);

    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
}
}

这是全部的代码。在我声明了两个final变量之后,设置背景颜色(setBackground)被提及。谢谢您提前的帮助。我从一本书中获得了这段代码,名为“Java软件解决方案”,我已经仔细地检查过多次,但没有运气:/ 再次感谢您。

5个回答

5

Snowman image

//<applet code='Snowman' width=300 height=200></applet>
import javax.swing.*;
import java.awt.*;

public class Snowman extends JApplet {
//---------------------------------------------
// Draws a snowman.
//---------------------------------------------
    public void init() {
        add(new SnowmanPanel());
        validate();
    }
}

class SnowmanPanel extends JPanel {

    final int MID = 150;
    final int TOP = 50;

    SnowmanPanel() {
        setBackground (Color.cyan);
    }

    public void paintComponent(Graphics page)
    {
        super.paintComponent(page);

        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);
        page.fillOval(MID+5, TOP+10, 5, 5);

        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
    }
}

一般建议。

  • 不要在顶级Swing组件中绘制。相反,将自定义绘图移到JPanelJComponent中,并在那里进行绘制。对于后者的自定义绘图,请覆盖paintComponent(Graphics)
  • 进行自定义绘图时,请记得调用super.paintComponent(Graphics)
  • 在构造函数(或init())中设置颜色,而不是在绘画方法中。

其他建议

  • 对于静态图像,您还可以将其绘制到BufferedImage中,并将图像放入JLabel中的ImageIcon中。这更简单。
  • 如果本书急于创建小程序,请丢掉它。小程序比标准应用程序困难得多,新手不应尝试。

1
请注意源代码中的 applet 标签使得可以轻松地从命令行进行测试,例如 /usr/bin/appletviewer SnowmanPanel.java。+1 - trashgod

3

试试这段代码

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

public class SnowMan extends JApplet
{

    public SnowMan()
    {
        setBackground(Color.cyan);
    }
//---------------------------------------------
// Draws a snowman.
//---------------------------------------------


    @Override
    public void paint(Graphics page)
    {
        final int MID = 150;
        final int TOP = 50;



        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);
        page.fillOval(MID + 5, TOP + 10, 5, 5);

        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
    }
}

Swing程序应该重写paintComponent()而不是重写paint()。—AWT和Swing中的绘图:绘图方法 - trashgod
2
@trashgod 给出的建议总体来说是不错的,尽管 JApplet 没有 paintComponent(Graphics) 方法。(这就是为什么我在关于 Swing 自定义绘制的第一部分中建议“不要在顶层容器中进行”,紧接着就是“重写 paintComponent(Graphics)” 的原因。);) - Andrew Thompson

1
setBackground (Color.cyan);

在我的IDE中它正常工作。我还改变了背景颜色。它运行得很好,没有问题。不需要更改代码。确保在创建类时注意。


1

paint(Graphics) 方法仅用于绘制参数(在您的情况下为 page)。 应用程序小程序背景颜色已在此阶段处理。

这就是为什么您可以通过在构造函数中设置它来解决问题的原因:

public Snowman()
{
    this.setBackground(Color.cyan);
}

1

我认为你需要使用getContentPane().setBackground()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接