2

大学向けのソフトウェアを作成しています。GUI が必要です。その最初のリビジョンでは、システムのルック アンド フィールを使用するようにしました (そのため、Linux/Mac/Windows 内のネイティブ アプリケーションのように見えます)。OSに基づいてすべてのJLabelsを異なるサイズにする必要があったため(解像度/ピクセル密度などに関係なく)、これは面倒であることがわかりました。

これを行った後、私は「よし、これをやり直すつもりはない」と思ったので、システムのルック アンド フィールを使用せず、Nimbus を試してみることにしました。私がテストしたプラットフォームでは見栄えがしますが、JLabel/JTextField のフォント サイズは、指定されているにもかかわらず (Sans Serif 12 など)、複数のプラットフォームで正しく表示されません。Font をすべてのプラットフォームで真にユニバーサルにし、このクロスプラットフォーム テストをすべて実行する必要がないようにする方法はありますか?

4

3 に答える 3

3

あなたが直面している問題は、各プラットフォームが互いに独立しているという事実です。メモリから (そして、これは今も昔に遡ります)、Java はその UI を 72 dpi でレンダリングします (これは最近変更された可能性があります)。

あるプラットフォームから別のプラットフォームに同じ結果が得られることはありません。これは、個々のプラットフォームの DPI 設定の違いに帰着します。

これは、Web ページの外観がプラットフォームごとに異なり、多くのアプリケーションの外観がわずかに異なるのと同じ理由でもあります。

サイズを直接設定するのではなく、慎重に UI を計画し、Swings の内部メトリックを賢く利用することが最善の方法です。

于 2012-08-16T20:39:14.627 に答える
2

ここに示すように、適切なレイアウトマネージャーを使用pack()すると、プラットフォームやフォントに関係なく、コンポーネントが適切なサイズを活用できるようになります。

画像

于 2012-08-17T00:57:06.533 に答える
2

主にできることは、特定のTrueType フォントを使用して、それをリソースとしてアプリケーションにバンドルすることです。このようにして、フォントがすべてのプラットフォームで同じように表示される可能性が最も高くなります。「サンセリフ」がすべてのプラットフォームで同じであるという保証はありません。Java は利用可能な最も近い一致を使用するだけです。

次に、実行時に次のような方法で .jar からフォントをロードできます。

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(filename)
Font font = Font.createFont(Font.TRUETYPE_FONT, is);

2 つ目のポイントとして、フォント サイズに適度な柔軟性があるようにアプリのレイアウトを設計することは常に価値があります。JLabel 用にもう少しスペースを空けたり、特定の場所でテキストを折り返したりする必要があるかもしれません。

于 2012-08-17T00:27:19.260 に答える