2009-12-03 31 views
19

私は、複数行のテキストでスウィングJLabelを作成しようとしています。それはちょうど良い追加されますが、改行が来ることはありません。これはどうすればいいですか?あるいは、JLabelの最大幅を指定して、divのようにテキストが折り返すことを知ることはできますか?Java:JLabelsの改行?

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);   
    } 

答えて

37

setTextでHTMLを使用します。

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

それとも、もっとダイナミックにそれをしたい場合は、その後、あなたが見る、HTML内の幅CSSやwidth属性を使用することができ、[ここ](http://stackoverflow.com/questions/2420742/make-a-jlabel -wrap-its-text-by-a-max-width/3194997#3194997) –

6

JLabelの内部にHTMLを挿入し、これを実現するためにlinebreakタグを使用することができます。

9

デフォルトでは、Swingはテキストを折り返しません。 JLabelでサイズを指定すると、適合するテキストの部分だけがペイントされ、最後に「...」が追加されます。

HTMLを使用して改行を有効にすることをお勧めします。しかし、私は実際にこれを達成するためにカスタムスイングUIデリゲートを作成しました。それ以上はMultiLineLabelUIです。

これは、使用可能なスペースに合わせてテキストを折り返しますが、改行も尊重します。

JLabel label = new JLabel("Text that'll wrap if necessary"); 
label.setUI(MultiLineLabelUI.labelUI);

または代わりに折り返しのあるテキストに加えて、垂直方向と水平方向のテキストの配置をサポートしているカスタムMultiLineLabelクラスを使用します。あなたはそれを試してみることを選択した場合、それは同じくらい簡単です。

UPDATE

私は元のコードサンプルでドメインを失いました。 https://github.com/sasjo/multiline

+0

内部的にもHTMLを使用していますか? – Pacerier

+0

@Pacerier:いいえ、ラップされたテキストにエフェクトをペイントする必要があるため、できませんでした。私はあなたがJTextAreaと同様の方法でテキストを壊していると言えるでしょう。 –

+1

@SamuelSjöbergbrokenリンク 'MultiLineLabelUI' – oliholz

3

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); 
+0

いいアイデアがありますが、欠点は1つだけです:書式設定されたテキストは使用できません。 – Robert

0

ラベルの最大幅は指定できませんでしたが、具体的な幅を指定できます。 のJLabelの現在の幅を測定することにより、我々は唯一のJLabelの幅は、私たちのmaxWidthその高い場合で固定し、新規を適用することができます:あなたは、HTMLの段落の幅を設定した場合

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); 
} 
7

あなたが自動改行を取得することができます。

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

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

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