0

这段代码来自 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

    }
}
4

1 回答 1

3

永远不要尝试绘制顶级组件。相反,创建一个扩展 JPanel 的类,覆盖它的paintComponent方法,确保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();
         }
      });
   }
}

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

于 2015-03-30T01:46:58.827 回答