2013-03-09 68 views
1

爲什麼此代碼輸出兩行大小相同的行?Graphics2D在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); 

    } 
} 

我希望這些行的大小不同,因爲它們的縮放比例不同。從我所看到的情況來看,我認爲這個量表是基於以前的量表。我對嗎?

如果這是真的,我將如何獲得第二條線來縮放我認爲應該是什麼?

感謝

+0

縮放是雪上加霜。所以第二個縮放語句是知道適用於第一個(這不會改變任何東西),請嘗試使用1.5代替寬度。更好的是,使用AffineTransofmration – MadProgrammer 2013-03-09 06:46:53

回答

3

你調用一個Graphics對象上不輸出的東西,而是改變它(如setColorsetFont,等等),都存儲在圖形對象的背景下,酒店的所有方法。實際上,您應該將Graphics實例想象爲圖形上下文,它包含並提取所有需要繪製到屏幕中的信息。

所以基本上,是的,你的第二個尺度是基於第一個尺度的,因爲第一個尺度改變圖形上下文,第二個尺度改變圖形上下文。

這裏有兩種方法來改變這種行爲:

  1. 通過aplying你的第一個變化的相反(在這種情況下,逆scalling)復位狀態的Graphics實例。
  2. 在應用任何上下文更改之前,製作一個複製對象的

我更傾向於第二種方案,但我這裏還有兩個例子:

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); 
+0

我無法讓你的第一個方法工作,但你的第二個方法工作得很好。 – 2013-03-09 06:56:33

+0

對不起,我的壞。您不必應用負面縮放比例,但可以應用使縮放恢復正常的值。在這種情況下,如果你的縮放量符合x的規模,那麼你將量表加倍以使其恢復正常。我會更新答案! – asermax 2013-03-09 14:26:21