画像を拡大するときに、ビューポートの新しい位置を計算する必要があります。
UI は次のように構築されます。
- ImagePanel は画像を描画します
- ImagePanelWrapper は、imagePanel をラップする JPanel です。
- JScrollPane には ImagePanelWrapper が含まれています
ズームインまたはズームアウトすると、ImagePanel のズーム倍率が変更され、ImagePanel の推奨サイズが再計算されます。したがって、ImagePanel が同じビューポート ポイントに留まっている場合でも、このパネルの画像は移動します。
ユーザーが CTRL を押しながらマウス ホイールを使用すると、次のメソッドが呼び出されます。指定されたポイントは、MouseWheelListener によって提供されるカーソル位置です。これらのメソッドの機能を使用すると、ズームインまたはズームアウトするときに、画像はすでに同じ左上の位置にとどまっています。
問題は、たとえば Paint.NET のように、マウスに対して相対的に移動する方法を理解できないことです。何か案は?
/**
*
*/
public void zoomOut(Point point) {
this.imagePanel.setZoom(this.imagePanel.getZoom() * 0.9f);
Point pos = this.getViewport().getViewPosition();
int newX = (int) (pos.x * 0.9f);
int newY = (int) (pos.y * 0.9f);
this.getViewport().setViewPosition(new Point(newX, newY));
this.imagePanel.revalidate();
this.imagePanel.repaint();
}
/**
*
*/
public void zoomIn(Point point) {
this.imagePanel.setZoom(this.imagePanel.getZoom() * 1.1f);
Point pos = this.getViewport().getViewPosition();
int newX = (int) (pos.x * 1.1f);
int newY = (int) (pos.y * 1.1f);
this.getViewport().setViewPosition(new Point(newX, newY));
this.imagePanel.revalidate();
this.imagePanel.repaint();
}