Graphics2D在PaintComponent()中缩放两次

时间:2013-03-09 06:40:26

标签: java line scale 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);

    }
}

我希望这些线条的大小不同,因为它们的缩放比例不同。从我所看到的,我认为规模是基于以前的规模。我这是对的吗?

如果这是真的,我如何将第二行缩放到我认为的应该是什么?

由于

1 个答案:

答案 0 :(得分:4)

您在Graphics对象上调用的所有方法都不会输出某些内容,而是更改其属性(如setColorsetFont等),这些方法都存储在图形对象的上下文。实际上,您应该将Graphics实例视为图形上下文,其中包含并抽象您需要绘制到屏幕中的所有信息。

所以基本上,是的,你的第二个比例基于第一个比例,因为第一个比例改变了图形上下文而第二个作用于它之上。

有两种方法可以改变这种行为:

  1. 通过与第一次更改相反的方式重置您的Graphics实例的状态(在这种情况下,反向缩放)。
  2. 在应用任何上下文更改之前,对Graphics对象进行复制
  3. 我更倾向于第二种选择,但这里有两个例子:

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