【问题标题】:Java applet with getSize().width, getSize().height带有 getSize().width、getSize().height 的 Java 小程序
【发布时间】:2014-08-12 03:12:42
【问题描述】:

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

这里是代码

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;

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

  • 的目的是什么

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(我知道默认的小程序大小是 200 x 200,可以在运行配置 -> 参数中进行修改)

【问题讨论】:

  • 这本书的建议在我看来并不合理。在我看来,Graphics2D 领域是对失败的邀请。如果有人试图在绘画方法之外使用它,他们将面临 NPE 或非持久性绘画的风险。代码还直接绘制到顶级容器applet,这通常是应该避免的,并且代码在paint方法中同时具有Thread.sleep(...)和对repaint()的调用!
  • 虽然某些“不良做法”可能是可以接受的,以便获得快速、激励性的结果,但 Swing 通常非常容易,它们不应该是必要的,而且不良做法充满鳗鱼的气垫船指出,导致这个问题的明显错字,以及使用getSize().width而不是getWidth()等细节并不是“简化”,而只是错误的做法。我一直觉得这些“……21天”的书很可疑……abstrusegoose.com/249
  • @Marco13 我正在阅读它的最后 30 多页,所以是时候继续前进了。因此,请随时向我推荐您选择的任何 JAVA 书籍。

标签: java swing colors background applet


【解决方案1】:

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

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

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

函数 getSize() 继承自超类 JApplet,因此 getSize.width() 获取的是小程序宽度而不是新创建对象的宽度。

因此,当您将背景更改为尺寸为 0 然后设置其颜色时,您正在设置没有任何大小的对象的颜色。由于此对象没有任何大小,因此您将其设置为什么颜色并不重要,因为您实际上不会看到它。

【讨论】:

  • 是的,我深有体会,只是我觉得为什么第一次声明它似乎不合理,除非作者只是忽略它或其他什么......?
  • 我更新了答案,但是是的,这看起来作者只是忘记了它是一个成员变量并且还创建了一个局部变量
  • 好的,我认为由于 Eclipse 给出了 200 x 200 的初始值,这可能是有道理的,所以 getSize().width, getSize().height 得到这些值?我说得对吗?而填充方法(稍后)实际上有一些东西要填充,但如果它像 background = new Rectangle2D.Float();那么矩形的大小为零,所以没有填充背景,我做对了吗?当然,稍后,当调用方法 drawString(第 43 行)时,小程序的大小会调整为 Eclipse 默认的 200x200?
  • 是的,当你说背景需要一个尺寸才能让你看到它的颜色时,你是对的。我看不出这里的默认值 200 来自哪里,但 drawString() 方法只是用于将文本呈现到屏幕上,因此它不应该对背景矩形产生任何影响。
猜你喜欢
  • 2016-04-05
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多