簡體   English   中英

在PaintComponent()中Graphics2D縮放兩次

[英]Graphics2D Scaling twice in PaintComponent()

為什么此代碼輸出兩條大小相同的行?

import java.awt.*;
import javax.swing.*;


public class G2Scale extends JPanel{
    public static void main(String args[]) {
        G2Scale g = new G2Scale();
        g.setPreferredSize(new Dimension(200, 200));

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(g);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2 = (Graphics2D) g;

        g2.setColor(Color.BLUE);
        g2.scale(0.5, 1.0);
        g2.drawLine(5, 50, 100, 50);

        g2.setColor(Color.GREEN);
        g2.scale(1.0, 1.0);
        g2.drawLine(5, 100, 100, 100);

    }
}

我希望這些線的大小不同,因為它們的縮放比例不同。 從我所看到的來看,我認為該比例是基於先前的比例。 我對嗎?

如果是這樣,我如何將第二行縮放到我認為應該的水平?

謝謝

Graphics對象上調用的所有不輸出任何東西,而是更改其屬性的方法(例如setColorsetFont等)都存儲在該圖形對象的上下文中。 實際上,您應該將Graphics實例視為一個圖形上下文 ,其中包含並抽象了需要繪制到屏幕中的所有信息。

因此,基本上,是的,您的第二個比例尺是基於第一個比例尺的,因為第一個比例尺會更改圖形上下文,而第二個比例尺將在此比例尺之上起作用。

有兩種方法可以更改此行為:

  1. 通過應用與第一次更改相反的狀態(在這種情況下為反向縮放)來重置Graphics實例的狀態。
  2. 應用任何上下文更改之前,請復制 Graphics對象。

我更傾向於第二種選擇,但這是這兩者的一些示例:

Graphics2D g2 = (Graphics2D) g;

// resetting the context state
g2.scale(0.5, 1.0);
g2.drawLine(5, 50, 100, 50);
g2.scale(2, 1.0);

// using a copy of the context
// note: casting is mandatory since 'create' returns a Graphics object
Graphics2D g2copy = (Graphics2D)g2.create(); 
g2copy.scale(1.0, 1.0);
g2copy.drawLine(5, 100, 100, 100);

// this one doesn't have any scale applied
g2.drawLine(5, 150, 100, 150);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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