0

次のコンポーネントは、移動およびサイズ変更すると正しくペイントされますが、画面の外からドラッグすると正しくペイントされません。

なんで?

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

これは、画面の左端からドラッグした場合に描画されるものです

4

2 に答える 2

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

于 2012-06-21T19:19:48.990 に答える
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());
}
于 2012-06-21T18:11:32.500 に答える