質問

重要な機能がモニターの解像度に基づいたGUIコンポーネントの自動スケーリングである、大規模なレガシーJavaアプリケーションに取り組んでいます。 JVMを実行するJVMを1.4.2から1.6にアップグレードしていますが、java.awt.Container.getPreferredSize()の実装の変更によりスケーリングが壊れています。

getPrefferedSizeは、setPreferredSize()で指定したものと同じオブジェクトを返すために使用されていたため(すべてが最小/最大サイズにもなります)、java.awt.Dimensionの特定のサブクラスを持つすべてのスケーリングコンポーネントでsetPRefferedSizeを呼び出します、コンポーネントの階層を歩いて、解像度が変更されるたびに各スケーリングコンポーネントを更新します。

ただし、Java 1.6ではgetPreferredSizeは渡したDimensionオブジェクトのコピーを返すため、正しい型ではなくなり、何もスケーリングされません。

コンポーネントパスをクラスパス上のJREの前に配置することで、コンポーネントクラスを独自の実装(オープンソースJREをありがとう)でオーバーライドすることで、ソリューションを非常に迅速にハッキングしました。ただし、このソリューションは明らかに保守可能ではありません。

他の誰かがこの問題に対する他の解決策を知っていますか?Java 1.5 / 1.6でGUIスケーリングをどのように実装しますか?

役に立ちましたか?

解決

以前のバージョンよりも1.6の方がコンポーネントの内部状態を保護しているようです。たぶん彼らは FindBugs を実行してバグ

この質問を初めて読んだとき、Java 1.6u10について考えました。 Highをサポートする Nimbus という新しいルックアンドフィールが含まれています。 DPIは、ベクトルグラフィックを使用してすべてのインターフェイスコンポーネントを描画する方法で表示します。

ただし、質問を少し遅く読んで、あなたが言っていることを理解しようとした後、内部コンポーネントのサイズを管理するレイアウトマネージャーを使用してユーザーインターフェイスを書き換えることをお勧めします。私の考えでは、あなたが提案するようにコンポーネントのサイズを手で管理するのは本当に良い考えではないということです。 jjnguy が示唆するように、GridBagLayoutを使用できます。レイアウトマネージャーには他にも多くの選択肢があります。 投稿された質問があり、全員のお気に入りのレイアウトマネージャーの調査を提供します。 GridBagLayoutとは異なるものを探しています。

他のヒント

レイアウトマネージャーの変更は適切なソリューションのように見えますが、この場合、UI(数千のコンポーネントを含む)の完全な再設計が必要になるため、これは実際にはこのアプリケーションの実用的なソリューションではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top