2014-06-21 35 views
0

我剛剛遇到了示例 - 本書中的教程,我不太明白。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,這可能會在運行配置被修改 - >參數)

+2

這本書的建議對我來說聽起來不太合理。我腦海中的Graphics2D領域是對失敗的邀請。如果有人試圖在繪畫方法之外使用它,他們冒着NPE或非持久性繪畫的風險。代碼還直接繪製到頂層容器,小程序,這是一般應該避免的,並且代碼同時具有'Thread.sleep(...)'和一個對'repaint()'的調用。在paint方法裏面! –

+1

雖然*某些*「壞習慣」可能是可以接受的,以獲得快速,激勵的結果,Swing總的來說非常容易,以至於它們不應該是必需的,而且Hovercraft Full Of Eels指出的不好的做法,明顯的錯誤引起了這個問題,並且像使用getSize()。width而不是getWidth()這樣的細節不是「簡化」,而只是錯誤的做法。我一直認爲這些「...在21天」書是可疑的... http://abstrusegoose.com/249 – Marco13

+0

@ Marco13我正在閱讀它的最後30多頁,所以現在是時候繼續前進。因此,請隨時向我推薦任何您選擇的JAVA書籍。 –

回答

1

在這例如有兩個名爲screen2D的對象。在第16行中聲明的第一個是一個成員變量,它是包私有的(可以被給定包中的所有類訪問)。正如你所指出的,這個變量似乎並沒有被使用。

第二個screen2D是在第26行聲明的局部變量,僅用於paint函數。

可能這是一個錯字,這個例子只需要其中一個變量。

函數getSize()繼承自超類JApplet,所以getSize.width()獲取applet寬度不是新創建對象的寬度。

所以,當你改變背景的尺寸爲0,然後設置它的顏色,你正在設置一個沒有任何尺寸的對象的顏色。由於此對象沒有任何大小,因此您無法真正看到它,因此設置它的顏色無關緊要。

+0

是的,我挖掘了這一點,對於我來說,爲什麼第一次宣佈它似乎是不合理的,除非作者完全忽略它或什麼。 –

+1

我更新了答案,但是這看起來像作者只是忘記了它是一個成員變量,並創建了一個局部變量也 – pwilmot

+0

好吧,我重新調整,因爲Eclipse給出的初始值爲200 x 200這可能是有道理的,所以getSize( ).width,getSize()。height獲取那些值?我對那件事很對嗎?而填充方法(稍後)實際上有東西要填充,但如果它是像background = new Rectangle2D.Float();那麼矩形的大小爲零,所以背景沒有填充,我得到它的權利?當然,稍後,當方法drawString(第43行)被調用時,applet被調整爲Eclipse默認的200x200? –

相關問題