複数行のテキストでSwing JLabelを作成しようとしています。正常に追加されますが、改行は行われません。どうすればよいですか?または、JLabelの最大幅を指定して、divのようにテキストが折り返されることを知っているだけですか?
private void addLegend() {
JPanel comparisonPanel = getComparisonPanel();
//this all displays on one line
JLabel legend = new JLabel("MMM FFF MMM FFFO O OOM M MMMM.\nMMM FFF MMM FFFO O OOM M MMMM.\nMMM FFF MMM FFFO O OOM M MMMM.\n");
comparisonPanel.add(legend);
}
SetTextでHTMLを使用します。
myLabel.setText("<html><body>with<br>linebreak</body></html>");
デフォルトでは、Swingはテキストを折り返しません。 JLabelでサイズを指定すると、テキストの収まる部分のみがペイントされ、最後に「...」が追加されます。
提案されているように、HTMLを使用して行の折り返しを有効にできます。ただし、これを実現するために、実際にカスタムSwing UIデリゲートを作成しました MultiLineLabelUI 。
使用可能なスペースに合わせてテキストを折り返し、改行も考慮します。試してみる場合は、次のように簡単です。
JLabel label = new JLabel("Text that'll wrap if necessary");
label.setUI(MultiLineLabelUI.labelUI);
または、カスタムのMultiLineLabel
クラスを使用して、テキストの折り返しに加えて、垂直および水平のテキスト配置をサポートします。
[〜#〜]更新[〜#〜]
元のコードサンプルでドメインを失いました。代わりにgithubで表示できます: https://github.com/sasjo/multiline
Htmlで段落の幅を設定すると、自動改行を取得できます。
label.setText("<html><p style=\"width:100px\">"+paragraph+"</p></html>");
JLabel内にHTMLを配置し、改行タグを使用してこれを実現できます。
JTextAreaでのラッピング機能の使用についてはどうですか?
String text = "some really long string that might need to"+
"be wrapped if the window is not wide enough";
JTextArea multi = new JTextArea(text);
multi.setWrapStyleWord(true);
multi.setLineWrap(true);
multi.setEditable(false);
JLabel single = new JLabel(text);
JPanel textpanel = new JPanel(new GridLayout(2,1));
textpanel.add(multi);
textpanel.add(single);
JFrame frame = new JFrame();
frame.add(textpanel);
frame.pack();
frame.setVisible(true);
シンプルでHTMLを使用します。 Java SwingコンポーネントはHTMLに「素晴らしい」サポートを提供していませんが、そのような単純な目的に使用できます。
label.setText("<html>This is first line.<br/>This is second line.</html>");
ラベルの最大幅を指定することはできませんでしたが、具体的な幅を指定できます。 JLabelの現在の幅を測定することにより、JLabelsの幅がmaxWidthよりも大きい場合にのみ、新しい固定を適用できます。
JLabel label = new JLabel("<html>" + myVeryLongMessage + "<html>");
int maxWidth = 400;
Dimension size = label.getPreferredSize();
if (size.width > maxWidth) {
// Estimate the number of lines
int lineCount = (int) Math.ceil(((double) size.width) / maxWidth);
lineCount += 1; // Add one extra line as reserve
size.width = maxWidth; // Apply the maximum width
// Increase the height so that all lines will be visible
size.height *= lineCount;
label.setPreferredSize(size);
}