2

このコードが同じサイズの 2 行を出力するのはなぜですか?

import java.awt.*;
import javax.swing.*;


public class G2Scale extends JPanel{
    public static void main(String args[]) {
        G2Scale g = new G2Scale();
        g.setPreferredSize(new Dimension(200, 200));

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(g);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

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

        Graphics2D g2 = (Graphics2D) g;

        g2.setColor(Color.BLUE);
        g2.scale(0.5, 1.0);
        g2.drawLine(5, 50, 100, 50);

        g2.setColor(Color.GREEN);
        g2.scale(1.0, 1.0);
        g2.drawLine(5, 100, 100, 100);

    }
}

これらの線は、縮尺が異なるため、異なるサイズになると思います。私が見ているものから、スケールは以前のスケールに基づいていると思います。私はこれについて正しいですか?

これが本当なら、どうすれば 2 番目の行を私が思っていたものにスケーリングすることができますか?

ありがとう

4

1 に答える 1

4

Graphics何かを出力するのではなく、オブジェクトのプロパティ ( 、 など) を変更するオブジェクトでsetColor呼び出すすべてのメソッドsetFontは、グラフィックス オブジェクトのコンテキストに格納されます。Graphics実際には、インスタンスは、画面に描画するために必要なすべての情報を含み、抽象化するグラフィック コンテキストと考える必要があります。

したがって、基本的に、はい、2 番目のスケールは最初のスケールに基づいています。最初のスケールはグラフィックス コンテキストを変更し、2 番目のスケールはその上で動作するためです。

この動作を変更するには、次の 2 つの方法があります。

  1. Graphics最初の変更の反対を適用して、インスタンスの状態をリセットします(この場合は逆スケーリング)。
  2. コンテキストの変更を適用する前に、オブジェクトのコピーを作成してください。Graphics

私は 2 番目のオプションに傾倒していますが、両方の例を次に示します。

Graphics2D g2 = (Graphics2D) g;

// resetting the context state
g2.scale(0.5, 1.0);
g2.drawLine(5, 50, 100, 50);
g2.scale(2, 1.0);

// using a copy of the context
// note: casting is mandatory since 'create' returns a Graphics object
Graphics2D g2copy = (Graphics2D)g2.create(); 
g2copy.scale(1.0, 1.0);
g2copy.drawLine(5, 100, 100, 100);

// this one doesn't have any scale applied
g2.drawLine(5, 150, 100, 150);
于 2013-03-09T06:50:45.330 に答える