それらをリンクするために、いくつかのポイントとポリゴンを描画する必要があります。カスタム ペインティングは、JScrollPane を使用して JPanel で実行され、AffineTransformation によるスケーリング/ズームをサポートします。JPanels の推奨サイズをポイント座標で定義された必要な寸法に設定し、再検証を行った後、図面が適切に表示され、スクロールできるようになりました。ポイント座標が、データ型整数、ズーム、および Dimension クラスの制限によって設定された制限を超えない限り、すべて問題ありません。
例: 座標に 4 つの点があるとします。
(10000,10000), (10000,-10000), (-10000,10000), (-10000,-10000).
それらは、中心に原点を持つ正方形の角を定義します。私の paintComponent メソッドの短い形式:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
// Backup original transform
AffineTransform originalTransform = g2d.getTransform();
// Set virtual drawing area to scroll through, scaled by zoomfactor
double viewZoomFactor = 1.0; // Will be set to other values != 1.0 later
// Because of the points coordinates a rectangle of size 20000 by 20000 is required
this.setPreferedSize(new Dimension(20000 * viewZoomFactor,20000 * viewZoomFactor));
this.revalidate();
// Move point of origin to the center
Point pointOfOrigin = new Point(10000, 10000);
// Translate all points and revert y-direction
AffineTransform t = AffineTransform.getTranslateInstance(
pointOfOrigin.x, this.getHeight() - pointOfOrigin.y)
t.scale(viewZoomFactor, -viewZoomFactor);
g2d.transform(t);
this.drawPointsAndPolygonOnPanel();
// Restore original transform
g2d.setTransform(originalTransform);
}
zoomFactor == 1.0 の場合、1 ピクセルは正確に 1 つの座標値に等しくなります。
それらのコンストラクターPoint(int, int)
により、ポイントは [Integer.MIN_VALUE, Integer.MAX_VALUE] によって [Integer.MIN_VALUE, Integer.MAX_VALUE] の平面内に配置できます。JPanels の推奨サイズは、タイプDimension(int,int)
です。通常、幅と高さの値は負でない整数です。
問題は巨大な座標値で発生します: 次のような点のセットを想像してください:
(Integer.MAX_VALUE,Integer.MAX_VALUE),
(Integer.MAX_VALUE,Integer.MIN_VALUE),
(Integer.MIN_VALUE,Integer.MAX_VALUE),
(Integer.MIN_VALUE,Integer.MIN_VALUE)
私が最初に考えたのは、すべての座標値を縮小する別の倍率を導入することでした。
t.scale(viewZoomFactor * dataZoomFactor, -viewZoomFactor * dataZoomFactor);
これにより、ピクセル対座標値の比率が減少します。viewZoomFactor = 1.0 での 1 ピクセル = 1/dataZoomFactor 座標値。
描画するポイントが上記の極端な位置に配置されている場合、描画全体の 1:1 のスケーリングされたスクロール可能な可視セクションを実現するにはどうすればよいですか? viewZoomFactor > 1.0 (拡大鏡) の場合は?