27

複数行のテキストでSwingJLabelを作成しようとしています。うまく追加されましたが、改行が入りません。どうすればよいですか?または、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);        
    }
4

8 に答える 8

50

setText で HTML を使用します。

myLabel.setText("<html><body>with<br>linebreak</body></html>");
于 2009-12-03T19:17:15.617 に答える
15

htmlで段落幅を設定すると自動改行ができます。

  label.setText("<html><p style=\"width:100px\">"+paragraph+"</p></html>");
于 2013-02-22T05:54:23.690 に答える
10

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

于 2009-12-03T19:26:47.053 に答える
6

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

于 2009-12-03T19:17:20.297 に答える
4

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);
于 2009-12-04T00:39:08.363 に答える
3

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

label.setText("<html>This is first line.<br/>This is second line.</html>");
于 2013-07-11T18:14:52.750 に答える
2

ラベルの最大幅を指定できませんでしたが、具体的な幅を指定できます。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);
}
于 2010-12-12T13:32:23.517 に答える