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

Java-为什么这个小程序的背景不显示为浅蓝色(青色)?,java,swing,applet,japplet,setbackground,Java,Swing,Applet,Japplet,Setbackground,这段代码来自Lewis Loftus的Java教科书。它显示教科书中的示例输出,背景为浅蓝色(青色)。我认为这有点问题: setBackground(Color.cyan); 以下是整个计划: import javax.swing.JApplet; import java.awt.*; public class Snowman extends JApplet { //-----------------------------------------------------------

这段代码来自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的背景,而不是在其paint或paintComponent方法中

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

e、 g


请注意,顶级窗口(如JApplets和JFrames)有点复杂,具有多个角色和多个层。一个问题是,您的程序试图直接使用JApplet的paint方法绘制,而忽略了applet的背景是由另一层绘制的,即它的contentPane,一个保存applet所有内容的JPanel。如果不调用super.paint(…)方法,还可能损坏小程序的绘制链,因为小程序自己的绘制(通过
super.paint(…)
调用)最终负责绘制所有小程序,包括其边框和子组件。

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

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

e、 g


请注意,顶级窗口(如JApplets和JFrames)有点复杂,具有多个角色和多个层。一个问题是,您的程序试图直接使用JApplet的paint方法绘制,而忽略了applet的背景是由另一层绘制的,即它的contentPane,一个保存applet所有内容的JPanel。如果不调用super.paint(…)方法,还可能损坏小程序的绘制链,因为小程序自己的绘制(通过
super.paint(…)
调用)最终负责绘制所有小程序,包括其边框和子组件。

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

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

e、 g


请注意,顶级窗口(如JApplets和JFrames)有点复杂,具有多个角色和多个层。一个问题是,您的程序试图直接使用JApplet的paint方法绘制,而忽略了applet的背景是由另一层绘制的,即它的contentPane,一个保存applet所有内容的JPanel。如果不调用super.paint(…)方法,还可能损坏小程序的绘制链,因为小程序自己的绘制(通过
super.paint(…)
调用)最终负责绘制所有小程序,包括其边框和子组件。

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

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

e、 g


请注意,顶级窗口(如JApplets和JFrames)有点复杂,具有多个角色和多个层。一个问题是,您的程序试图直接使用JApplet的paint方法绘制,而忽略了applet的背景是由另一层绘制的,即它的contentPane,一个保存applet所有内容的JPanel。如果不调用super.paint(…)方法,还可能损坏小程序的绘制链——因为小程序自己的绘制(通过
super.paint(…)
调用)最终负责绘制所有小程序,包括其边框和子组件。

设置小程序的
背景颜色,但千万不要让小程序自己绘制。您不应该在任何绘制方法中更改任何组件的状态,这只会导致触发更多绘制事件,使您陷入一个永无止境的螺旋,因为您的小程序会消耗越来越多的CPU周期。查看和了解有关绘制工作原理的更多详细信息为什么要编写小程序?如果是老师指定的,请参考。这真的只是为了我自己的图形练习。绘制矩形、椭圆形等。您可以设置小程序的背景颜色,但决不能让小程序自己绘制。您不应该在任何绘制方法中更改任何组件的状态,这只会导致触发更多绘制事件
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();
         }
      });
   }
}