3

こんにちは、私はaffineTransformJavaが初めてです。後で使用する必要があるいくつかの GUI をせん断するために使用したいと考えています。今のところ、サンプル コードをテストしたかっただけですが、その出力を説明することはできません。ここにコードがあります

    package main;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.geom.AffineTransform;

    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JPanel;

    public class MainClass{
    public static void main(String[] args) {
    JFrame jf = new JFrame("Demo");

    jf.getContentPane().add(new MyCanvas());

    jf.setSize(600, 600);
    jf.setVisible(true);
  }
}

    class Left extends JPanel {

    Left(){
        setPreferredSize(new Dimension(450,450));
        setBorder(BorderFactory.createLineBorder(Color.green));
        setBackground(Color.gray);

    }


      public void paintComponent(Graphics g) {

            super.paintComponent(g);

            Graphics2D g2 = (Graphics2D) g;

            AffineTransform at = new AffineTransform();

            g2.setTransform(at);

            g2.drawRect(getWidth()/2 - 10, getHeight()/2 - 10, 20, 20);

          }
}

    class MyCanvas extends JPanel {

    MyCanvas()
    {
        setBorder(BorderFactory.createLineBorder(Color.red));
        setLayout(new FlowLayout(FlowLayout.CENTER));
        add(new Left());
    }


}

授業で描きたい四角形Leftが真ん中右に出る??しかし、その来るのは左にずれています..外枠に対して相対的に座標をとっているようです。を削除すると、g2.setTransform(at);正常になります..理由を説明してもらえますか??

4

4 に答える 4

7

このメソッドは、レンダリング後setTransformに元の変換を復元することのみを目的としています。ただし、Swing コンポーネントのレンダリングなど、他の目的で必要な変換が既に存在する可能性があるため、既存の変換の上に新しい座標変換を適用しないGraphics2Dでください。あなたのコードはこの点を例示しています。座標変換を追加するには、、、、、またはメソッドを使用します。Graphics2Dtransformrotatescaleshear

于 2011-07-15T12:40:29.810 に答える
3

おそらくいくつかの軽量コンポーネントを描画しています。つまり、独自の座標系を持っていません。そのため、最も近い重い親の座標を使用します。システム。

そのため、やりたい変換と元の変換を組み合わせる(乗算する)必要があります。

描画が完了したら、(おそらく) 元の変換を復元する必要があります。

于 2011-07-15T11:23:51.333 に答える
2

@littelの回答を拡張すると、以下の例を使用してフレームのサイズが変更されたときに、現在の変換をIDと比較できます。並進成分のみが変化することに注意してください。はとdx = 75.0の幅の差の半分でMyCanvasありLeft、緑の境界線のdy垂直オフセットとサイズが含まれています。Left

アイデンティティ:AffineTransform [[1.0、0.0、0.0]、[0.0、1.0、0.0]]
アイデンティティ:AffineTransform [[1.0、0.0、0.0]、[0.0、1.0、0.0]]
現在:AffineTransform [[1.0、0.0、75.0]、[0.0、1.0、201.0]]
現在:AffineTransform [[1.0、0.0、75.0]、[0.0、1.0、1.0]]

デモ画像

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.geom.AffineTransform;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainClass {

    public static void main(String[] args) {
        JFrame jf = new JFrame("Demo");
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setLayout(new GridLayout(0, 1));
        jf.add(new MyCanvas());
        jf.add(new MyCanvas());
        jf.pack();
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
    }
}

class MyCanvas extends JPanel {

    MyCanvas() {
        setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
        setPreferredSize(new Dimension(600, 200));
        setBorder(BorderFactory.createLineBorder(Color.red));
        add(new Left(), BorderLayout.CENTER);
    }
}

class Left extends JPanel {

    Left() {
        setPreferredSize(new Dimension(450, 100));
        setBorder(BorderFactory.createLineBorder(Color.green));
        setBackground(Color.gray);
        System.out.println("Identity: " + new AffineTransform());
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        System.out.println("Current: " + g2.getTransform());
        g2.drawRect(getWidth() / 2 - 10, getHeight() / 2 - 10, 20, 20);
    }
}
于 2011-07-16T19:44:42.100 に答える
-3

どこに問題があるかはわかっています。親と同じグラフィックスを描画します。"super.paintComponent(g);"

super.repaint(); のようなものを試してください。

于 2011-07-15T11:45:50.730 に答える