为什么这段代码会输出两条大小相同的行?
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 :(得分:4)
您在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);