0

スクリーンショットの撮影を扱う小さなJavaアプリケーションを構築しています。画像を保持するScreenshotPanelと呼ばれるJPanelから継承するカスタムクラスがあり、それはJScrollPane内にあります。フレームのサイズが変更されると、ScrollPaneが移動してサイズが変更されます。ズーム部分を除いてすべてうまく機能します。ScrollPane内のscreenshotPanelのサイズを制御できるようにしたいのですが、screenshotPanelはサイズ変更されず、適切なサイズで一瞬ちらつきますが、その後ScrollPaneにサイズ変更されます。サイズ。

ScrollPaneなしでscreenshotPanelを使用すると、正確に機能しますが、ズームイン中に画像を移動できるように、自動的にスクローラーを追加する必要があります。

サイズ変更に使用するコードの一部は次のとおりです。

    double AR=((double)screenshotPanel.getImage().getHeight())/screenshotPanel.getImage().getWidth();

    screenshotPanel.setSize((int)((getWidth()-180)*zoomFactor), (int)((AR*(getWidth()-180)-100)*zoomFactor));
    scrollPane.setSize(getWidth()-180, (int)(AR*(getWidth()-180))-100);

-180と-100は、ボタンとズームコントロールコンポーネント(すべてが完全に移動およびサイズ変更されます)用のスペースを維持するために使用されます。zoomFactorは、ズームする量を保持するdoubleです。

ScrollPaneがサイズを強制的に戻さずに、ScrollPane内のscreenshotPanelのサイズを変更するにはどうすればよいですか?

4

1 に答える 1

1

コンポーネントのサイズを変更しても、サイズの変更を補正するためのコードがペイントメソッドに含まれていない限り、画像は拡大縮小されません。

JViewPortはコンポーネントの推奨サイズを尊重しているため、サイズを変更してビューポートがリセットすると、このちらつきが発生します。

パネルにメソッドを追加し、scaleメソッドをオーバーライドしますgetPreferredSize

を呼び出すときにsetScale、新しいスケーリングされたサイズを計算します。getPreferredSizeメソッドがこれらの値を返すことを確認してください。

を呼び出す必要がありinvalidate、場合によってrepaintは、コンテナ階層を通じて変更が更新されていることを確認する必要があります。

ペインはそれ自体で画像のサイズを変更しないことを忘れないでください。これを取得するのはあなたの責任です;)

于 2012-11-02T20:44:21.793 に答える