2013-07-06 35 views
1

我有一个简单的问题要问。Java Affine转换

是否可以在paint/paintComponent上下文之外进行仿射变换?例如,假设我想创建一个由通用路径组成的Shape,然后将其旋转45°。 是否有可能创建该对象,然后将其始终在类构造函数中旋转,而不是创建对象,然后在paint/paintComponent方法中将其旋转?

非常感谢。


UPDATE

非常感谢您的信息家伙。 所以今天我做了一个简单的测试,如你所建议的,它的工作原理。

这与仿射的paintComponent方法里面变换,说:

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D)g; 
    g2.setColor(new Color(230, 230, 230)); 
    g2.fill(enne.getNuvola());//enne.getNuvola(): code from an omitted class. returns a Shape of a cloud 
    g2.setColor(new Color(20, 20, 20)); 

    /* 
    AffineTransform t = AffineTransform.getTranslateInstance(400,400); 
    g2.transform(t);   
    */ 

    g2.fill(rock.getRocket()); 

}//paintComponent 

,这是一个的GeneralPath的类构造函数里面的仿射变换

public class Rocket { 

GeneralPath rocket; 

public Rocket(){ 

    rocket = new GeneralPath(); 
    rocket.moveTo(10,10); 
    rocket.lineTo(15,15); 
    rocket.lineTo(15,50); 
    rocket.lineTo(5,50); 
    rocket.lineTo(5,15); 
    rocket.lineTo(10,10); 
    rocket.closePath(); 

    AffineTransform t = AffineTransform.getTranslateInstance(400,400); 
    rocket.transform(t); 


}//Rocket Costruttore 

public GeneralPath getRocket(){ 
    return this.rocket; 
} 

}//Rocket 

但现在我还有一个问题:

我是否还必须保护当前状态的当前变形也在Rocket类中,就像它建议为paintCo做的那样mponent方法在java transforming tutorial

  1. 使用getTransform方法获取当前变换。
  2. 使用变换,平移,缩放,剪切或旋转来连接变换。
  3. 执行渲染。
  4. 使用setTransform方法恢复原始变换。

再次,非常感谢你对你的答案:-)

+1

是的,这是可能的。 –

+1

我是安德鲁·汤普森说的。这确实是可能的。为什么不试试呢? –

+1

这是一个特别有益的练习;使用'Shape'的'PathIterator'来查看效果。 – trashgod

回答

1

不,变换应该仅重置恢复图形对象的状态,因为该图形对象可以通过该系统对其他图纸被重用。如果您在没有Graphics对象的情况下进行转换,则不需要担心这一点。

请注意,您不应该通过编辑旧问题来提出新问题,因为这会让人困惑。你应该发布一个全新的问题(可能会链接你的旧问题)。

+0

你非常。 非常感谢您的编辑/回答提示。 – Emanuele