带有getSize()。width,getSize()。height的Java applet

时间:2014-06-21 15:06:08

标签: java swing colors background applet

我刚刚遇到了一些例子 - 书中的教程,我不太明白。

所以这是代码

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.util.GregorianCalendar;

import javax.swing.JApplet;

public class Watch extends JApplet {
    private final Color butterscotch = new Color(255, 204, 102);
    Rectangle2D.Float background;

    // Whats is purpose of following line, here on this place? Applet works well even without it?
    Graphics2D screen2D;

    @Override
    public void init() {
        setBackground(Color.black);
    }

    @Override
    public void paint(Graphics screen) {
        super.paint(screen);
        Graphics2D screen2D = (Graphics2D) screen;
        Font type = new Font("Monospaced", Font.BOLD, 20);
        screen2D.setFont(type);
        screen2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        if (background == null) {
            // set up the background rectangle
            // Whats is purpose of following line? Applet works well even without parameters?
            background = new Rectangle2D.Float(0F, 0F, getSize().width, getSize().height);
            // But if previous line is omit then background color is not set - why?
            // background = new Rectangle2D.Float(0F, 0F, 0F, 0F);
            // background = new Rectangle2D.Float();
        }
        screen2D.fill(background);
        GregorianCalendar day = new GregorianCalendar();
        String time = day.getTime().toString();
        screen2D.setColor(butterscotch);
        screen2D.drawString(time, 5, 25);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // do nothing
        }

        repaint();
    }
}

我的问题是:

  • 此声明的目的是什么(第16行),代码中的这个地方:

    Graphics2D screen2D;

代码即使没有它也能正常工作?更准确地说,稍后在paint()(第26行)中使用相同的对象名称(screen2D)声明Graphics2D对象。

  • 的目的是什么
这一行中的

getSize().width, getSize().height(33):

background = new Rectangle2D.Float(0F, 0F, getSize().width, getSize().height);

我的意思是,当没有定义(在此对象创建之前)大小时,它怎么能获得新创建的对象的大小?好吧,我认为既然Eclipse给出的初始值为200 x 200,这可能是有意义的,所以getSize()。width,getSize()。height得到那些值?我是对的吗?

此外,以下(替换)代码行中的任何一行都可以正常工作,而不是那一行:

background = new Rectangle2D.Float(0F, 0F, 0F, 0F);

background = new Rectangle2D.Float();

但是,这是另一个问题

  • 如果background = new Rectangle2D.Float(0F, 0F, getSize().width, getSize().height);
  • 代替

background = new Rectangle2D.Float(0F,0F,0F,0F);

 background = new Rectangle2D.Float();

然后背景颜色不是init()第20行中定义的黑色

setBackground(Color.black);

但它有点灰色。为什么?我在这里想念什么?

还有一点需要注意:我正在使用Eclipse IDE Kepler,无论如何在这种情况下都很重要(我知道默认的applet大小是200 x 200,可以在运行配置中修改 - >参数)

1 个答案:

答案 0 :(得分:1)

在此示例中,有两个名为screen2D的对象。在第16行声明的第一个是包私有的成员变量(可以由给定包中的所有类访问)。正如你所指出的,这个变量似乎根本就没用过。

第二个screen2D是第26行声明的局部变量,仅用于paint函数。

可能这是一个拼写错误,示例中只需要其中一个变量。

函数getSize()继承自超类JApplet,因此getSize.width()使applet宽度不是新创建对象的宽度。

因此,当您更改背景以使尺寸为0然后设置其颜色时,您将设置不具有任何尺寸的对象的颜色。由于这个物体没有任何尺寸,所以你设定它的颜色并不重要,因为你实际上看不到它。