簡體   English   中英

帶有getSize()。width,getSize()。height的Java Applet

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM