我刚刚遇到了一些例子 - 书中的教程,我不太明白。
所以这是代码
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,可以在运行配置中修改 - >参数)
答案 0 :(得分:1)
在此示例中,有两个名为screen2D的对象。在第16行声明的第一个是包私有的成员变量(可以由给定包中的所有类访问)。正如你所指出的,这个变量似乎根本就没用过。
第二个screen2D是第26行声明的局部变量,仅用于paint函数。
可能这是一个拼写错误,示例中只需要其中一个变量。
函数getSize()继承自超类JApplet,因此getSize.width()使applet宽度不是新创建对象的宽度。
因此,当您更改背景以使尺寸为0然后设置其颜色时,您将设置不具有任何尺寸的对象的颜色。由于这个物体没有任何尺寸,所以你设定它的颜色并不重要,因为你实际上看不到它。