2

为什么这段代码输出两行大小相同?

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

    }
}

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

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

谢谢

4

1 回答 1

4

您在对象上调用的所有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);
于 2013-03-09T06:50:45.330 回答