2012-06-21 31 views
0

如果移动和调整大小,下列组件将正确绘制,但如果从屏幕中拖出,则不会正确绘制。这个JComponent为什么不能正确绘制?

为什么?

public class Test_ShapeDraw { 
public static class JShape extends JComponent { 

    private Shape shape; 
    private AffineTransform tx; 
    private Rectangle2D bounds; 

    public JShape() { 
    } 

    public void setShape(Shape value) { 
     this.shape = value; 
     bounds = shape.getBounds2D(); 
     setPreferredSize(new Dimension((int) bounds.getWidth(), (int)bounds.getHeight())); 
     tx = AffineTransform.getTranslateInstance(-bounds.getMinX(), -bounds.getMinY()); 

    } 

    public Shape getShape() { 
     return shape; 
    } 


    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     if(shape != null) { 
      Graphics2D g2d = (Graphics2D)g; 
      g2d.setTransform(tx); 
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      ((Graphics2D)g).draw(shape); 
     } 

    } 




} 


public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 


private static void createAndShowGUI() { 

    Shape shape = new Ellipse2D.Double(0,0,300,300); 

    JShape jShape = new JShape(); 
    jShape.setShape(shape); 

    JFrame f = new JFrame("Shape Test"); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.add(jShape); 
    f.pack(); 
    f.setVisible(true); 
} 
} 

This is what it draws if dragged from out of the left screen edge

+0

你是什么意思“拖出屏幕”?我无法用您的代码重现您的问题。 –

回答

4
  AffineTransform originalTransform = g2d.getTransform(); 
      g2d.transform(tx); 

      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      ((Graphics2D)g).draw(shape); 

      g2d.setTransform(originalTransform); 

说明:参见Graphics2D.setTransform的JavaDoc :警告:永远不要使用此方法在现有转换之上应用新的坐标转换,因为Graphics2D可能已经具有转换需要用于其他目的,比如渲染Swing组件或应用缩放转换来调整打印机的分辨率。

要添加坐标变换,请使用变换,旋转,缩放或剪切方法。 setTransform方法仅用于在渲染后恢复原始的Graphics2D变换。

http://docs.oracle.com/javase/6/docs/api/java/awt/Graphics2D.html#setTransform%28java.awt.geom.AffineTransform%29

0

尽量去除的getPreferredSize()方法和在setShape方法使用了setPreferredSize():

public void setShape(Shape value) { 
    this.shape = value; 
    bounds = shape.getBounds2D(); 
    setPreferredSize(new Dimension((int) bounds.getWidth(), (int)bounds.getHeight())); 
    tx = AffineTransform.getTranslateInstance(-bounds.getMinX(), -bounds.getMinY()); 
} 
+0

没有帮助。效果是一样的。 –

相关问题