gpt4 book ai didi

java - AffineTransform 翻译不同的图形对象

转载 作者:行者123 更新时间:2023-12-02 04:32:57 26 4
gpt4 key购买 nike

我从此方法调用我的绘制类:

@Override
protected void paintComponent(Graphics g) {

super.paintComponent(g);
DrawGradient gradient = new DrawGradient();
gradient.draw(g);

DrawCoordinateSystem coor = new DrawCoordinateSystem();
coor.draw(g);
}

我尝试变换 DrawGradient 类中的对象,但由于某种原因,类 DrawCoordinateSystem 中的 Graphics 对象被变换。为什么?

DrawCooperativeSystem 类:

public class DrawCoordinateSystem {

public DrawCoordinateSystem() {
// TODO Auto-generated constructor stub
}

public void draw(Graphics g1){

Color customcolor = new Color(210,191,245);

int x0 = 15, y0 = 15;

int Xpoints[] = {x0+45, x0+40, x0+40};
int Ypoints[] = {y0, y0-5, y0+5};

int Xpoints1[] = {x0, x0+5, x0-5};
int Ypoints1[] = {y0+45, y0+40, y0+40};


g1.setColor(customcolor);

g1.drawPolygon(Xpoints,Ypoints, 3);
g1.fillPolygon(Xpoints,Ypoints, 3);

g1.drawPolygon(Xpoints1,Ypoints1, 3);
g1.fillPolygon(Xpoints1,Ypoints1, 3);

g1.drawLine(x0, y0, x0+40, y0);
g1.drawLine(x0, y0, x0, y0+40);

g1.setFont(new Font("TimesRoman", Font.PLAIN, 12));
g1.drawString("x", 52, 30);

g1.setFont(new Font("TimesRoman", Font.PLAIN, 12));
g1.drawString("y", 23, 57);

}

}

DrawGradient 类:

public class DrawGradient {

public DrawGradient() {

}


private Color c1;
private Color c2;


public void draw( Graphics g ) {

Graphics2D g2d1 = (Graphics2D) g;
GradientPaint gp = new GradientPaint(0, 0, c2, 0, 100, c1);
g2d1.setPaint(gp);
Rectangle reckt = new Rectangle(0,0,100,100);
g2d1.fill(reckt);

AffineTransform move = new AffineTransform();
move.translate(200, 200);
g2d1.setTransform(move);





}

}

最佳答案

转换是复合的,因此,一旦应用转换,完成后就需要反转它。

现在,您可以手动执行此操作,或者您可以预先创建 Graphics 上下文的副本,并在完成后将其丢弃。这可以防止您对副本属性所做的任何更改影响到原件(但您绘制的内容仍然保留)

Painted

public class TestPane extends JPanel {

public TestPane() {
}

@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Color c1 = new Color(0, 0, 255);
Color c2 = new Color(0, 255, 255);
GradientPaint gp = new GradientPaint(0, 0, c1, 0, 100, c2);

Graphics2D g2d = (Graphics2D) g.create();
g2d.setPaint(gp);
g2d.setTransform(AffineTransform.getTranslateInstance(100, 100));
g2d.fill(new Rectangle(0, 0, 100, 100));
g2d.dispose();

g2d = (Graphics2D) g.create();
g2d.setPaint(gp);
g2d.fill(new Rectangle(0, 0, 100, 100));
g2d.dispose();
}

}

在您的情况下,例如,在将 Graphics 上下文传递给其他方法之前,我会先创建一个副本

Graphics2D g2d =(Graphics2D)g.create();
DrawGradient gradient = new DrawGradient();
gradient.draw(g2d);
g2d.dispose();

g2d =(Graphics2D)g.create();
DrawCoordinateSystem coor = new DrawCoordinateSystem();
coor.draw(g2d);
g2d.dispose();

这样您就可以掌控一切。如果可以避免的话,我建议不要在 paintComponent 方法中创建新对象,特别是如果这些对象并没有像 paintComponent 那样从一个绘制周期真正改变到另一个绘制周期快速连续被多次调用

关于java - AffineTransform 翻译不同的图形对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31216446/

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