2013-03-09 65 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