[英]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
對象上調用的所有不輸出任何東西,而是更改其屬性的方法(例如setColor
, setFont
等)都存儲在該圖形對象的上下文中。 實際上,您應該將Graphics
實例視為一個圖形上下文 ,其中包含並抽象了需要繪制到屏幕中的所有信息。
因此,基本上,是的,您的第二個比例尺是基於第一個比例尺的,因為第一個比例尺會更改圖形上下文,而第二個比例尺將在此比例尺之上起作用。
有兩種方法可以更改此行為:
Graphics
實例的狀態。 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.