我剛剛遇到了示例 - 本書中的教程,我不太明白。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 ;
即使沒有它,代碼也能正常工作嗎?更確切地說,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開普勒如果在這種情況下,無論如何事項(我知道,默認的小程序大小爲200×200,這可能會在運行配置被修改 - >參數)
這本書的建議對我來說聽起來不太合理。我腦海中的Graphics2D領域是對失敗的邀請。如果有人試圖在繪畫方法之外使用它,他們冒着NPE或非持久性繪畫的風險。代碼還直接繪製到頂層容器,小程序,這是一般應該避免的,並且代碼同時具有'Thread.sleep(...)'和一個對'repaint()'的調用。在paint方法裏面! –
雖然*某些*「壞習慣」可能是可以接受的,以獲得快速,激勵的結果,Swing總的來說非常容易,以至於它們不應該是必需的,而且Hovercraft Full Of Eels指出的不好的做法,明顯的錯誤引起了這個問題,並且像使用getSize()。width而不是getWidth()這樣的細節不是「簡化」,而只是錯誤的做法。我一直認爲這些「...在21天」書是可疑的... http://abstrusegoose.com/249 – Marco13
@ Marco13我正在閱讀它的最後30多頁,所以現在是時候繼續前進。因此,請隨時向我推薦任何您選擇的JAVA書籍。 –