gpt4 book ai didi

java - Graphics2D 在 PaintComponent() 中缩放两次

转载 作者:行者123 更新时间:2023-11-30 07:18:33 26 4
gpt4 key购买 nike

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

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

}
}

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

如果这是真的,我如何让第二行按我认为应该的比例缩放?

谢谢

最佳答案

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

关于java - Graphics2D 在 PaintComponent() 中缩放两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15308057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com