web-dev-qa-db-ja.com

Java:JLabelsの改行?

複数行のテキストで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);        
    }
23
Nick Heiner

SetTextでHTMLを使用します。

myLabel.setText("<html><body>with<br>linebreak</body></html>");
45

デフォルトでは、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

10
Samuel Sjöberg

Htmlで段落の幅を設定すると、自動改行を取得できます。

  label.setText("<html><p style=\"width:100px\">"+paragraph+"</p></html>");
9
sayem siam

JLabel内にHTMLを配置し、改行タグを使用してこれを実現できます。

6
Amir Afghani

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);
3
Stew

シンプルでHTMLを使用します。 Java SwingコンポーネントはHTMLに「素晴らしい」サポートを提供していませんが、そのような単純な目的に使用できます。

label.setText("<html>This is first line.<br/>This is second line.</html>");
2
JavaTechnical

ラベルの最大幅を指定することはできませんでしたが、具体的な幅を指定できます。 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);
}
1
Robert