1

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

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

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

Component クラスをクラスパスの JRE の前に配置することで独自の実装 (オープンソース JRE に感謝) でオーバーライドすることで、非常に迅速にソリューションをハックしました。ただし、このソリューションは明らかに維持できません。

Java 1.5/1.6 で GUI スケーリングをどのように実装しますか?

4

2 に答える 2

2

1.6 では、以前よりもコンポーネントの内部状態をより適切に保護しているようです。おそらく、彼らはFindBugsを実行してバグを修正したのでしょう。

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

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

于 2008-10-09T18:19:06.857 に答える
0

レイアウト マネージャーを変更することは良い解決策のように思えますが、この場合、UI (数千のコンポーネントを含む) を完全に再設計する必要があるため、このアプリケーションにとって実際的な解決策ではありません。

于 2008-10-09T18:49:51.523 に答える