[英]Java applet with getSize().width, getSize().height
我剛剛遇到了一個例子-書中的教程,我不太了解。
所以這是代碼
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()中使用相同的對象名稱(screen2D)聲明Graphics2D對象(第26行)。
這行(33)中的getSize().width, getSize().height
:
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,可以在Run configuration-> parameters中對其進行修改)
在此示例中,有兩個對象稱為screen2D。 在第16行聲明的第一個變量是包私有的成員變量(可以由給定包中的所有類訪問)。 正如您所指出的,此變量似乎根本沒有使用。
第二個screen2D是在第26行聲明的局部變量,僅在paint函數中使用。
可能是拼寫錯誤,示例中僅需要這些變量之一。
函數getSize()是從超類JApplet繼承的,因此getSize.width()獲取的是applet的寬度,而不是新創建對象的寬度。
因此,當您將背景的尺寸更改為0,然后設置其顏色時,便是在設置沒有任何尺寸的對象的顏色。 由於此對象沒有任何大小,因此設置為哪種顏色都沒有關系,因為您實際上不會看到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.