【发布时间】: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