web-dev-qa-db-ja.com

JLabelのフォントのサイズを変更して最大サイズにする方法

コンテナにJLabelがあります。フォントのデフォルトサイズは非常に小さいです。 JLabelのテキストが最大サイズになるようにします。

どうやってやるの?

63
g123k

最もきれいなコードではありませんが、次のコードはJLabelと呼ばれるlabelの適切なフォントサイズを選択して、ラベルをオーバーフローさせずに内部のテキストが可能な限り内部に収まるようにします。

Font labelFont = label.getFont();
String labelText = label.getText();

int stringWidth = label.getFontMetrics(labelFont).stringWidth(labelText);
int componentWidth = label.getWidth();

// Find out how much the font can grow in width.
double widthRatio = (double)componentWidth / (double)stringWidth;

int newFontSize = (int)(labelFont.getSize() * widthRatio);
int componentHeight = label.getHeight();

// Pick a new font size so it will not be larger than the height of label.
int fontSizeToUse = Math.min(newFontSize, componentHeight);

// Set the label's font size to the newly determined size.
label.setFont(new Font(labelFont.getName(), Font.PLAIN, fontSizeToUse));

基本的に、コードは JLabel のオブジェクトを使用して FontMetrics のテキストが占めるスペースを調べ、その情報を使用して最大のフォントサイズを決定します。 JLabelからテキストをオーバーフローさせずに使用されます。

上記のコードは、おそらくPaintを保持するJFrameJLabelメソッド、またはフォントサイズを変更する必要があるときに呼び出されるメソッドに挿入できます。

以下は、実行中の上記のコードのスクリーンショットです。

alt text
(ソース: coobird.net

69
coobird
label = new JLabel("A label");
label.setFont(new Font("Serif", Font.PLAIN, 14));

SwingコンポーネントでHTMLを使用する方法 から取得

107
Asaf David
 JLabel textLabel = new JLabel("<html><span style='font-size:20px'>"+Text+"</span></html>");
9
Ehsan Jelodar

ラベルのソースコード-色とフォントの変更方法(Netbeans)

jLabel1.setFont(new Font("Serif", Font.BOLD, 12));


jLabel1.setForeground(Color.GREEN);
3
Bekim Fetaji

受け入れられた答えにはいくつかの制限があることを指摘したかった(それを使用しようとしたときに発見した)

  1. 書かれているように、実際にはpreviousフォントサイズの比率に基づいてフォントサイズを再計算し続けます。 ..したがって、数回の呼び出しの後、フォントサイズが大きすぎます。 (たとえば、DESIGNEDフォントとして12ポイントで開始し、ラベルを1ピクセルだけ拡張すると、公開されたコードは、フォントサイズを12 *(たとえば)1.2(テキストに対するフィールドスペースの比率)= 14.4または14ポイントフォントとして計算します。もう1つのピクセルと呼び出しを行うと、16ポイントになります!)。

したがって、繰り返し呼び出しの設定(ComponentResizedListener、またはカスタム/変更されたLayoutManager)での使用には(適応なしで)適切ではありません。

リストされているコードは、開始サイズを10 ptと想定していますが、現在のフォントサイズを参照しているため、1回呼び出す(ラベルの作成時にフォントのサイズを設定する)のに適しています。 int newFontSize = (int) (widthRatio * 10);ではなくint newFontSize = (int)(labelFont.getSize() * widthRatio);を実行すると、マルチコール環境でより適切に動作します。

  1. new Font(labelFont.getName(), Font.PLAIN, fontSizeToUse))を使用して新しいフォントを生成するため、更新されたフォントの元のフォントからの太字、斜体、または色などのサポートはありません。代わりにlabelFont.deriveFontを使用すると、より柔軟になります。

  2. このソリューションは、HTMLラベルテキストのサポートを提供しません。 (これはおそらく提供された回答コードの意図した結果ではなかったと思いますが、HTMLテキストJLabelJPanelに持っていたので、正式に制限を発見しました。FontMetrics.stringWidth()htmlタグの幅の包括的-つまり、単なるテキストとして)

this SO question への答えを見るのをお勧めします。trashgodの答えは、ほぼ同一の質問に対するさまざまな答え(これを含む)を指します。そのページでは、他の回答の1つを30〜100倍高速化する追加の回答を提供します。

1
Warren K