2009-12-03 3 views
19

여러 줄의 텍스트가있는 Swing 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

또는 http://stackoverflow.com/questions/2420742/make-a-jlabel ([여기]를 참조 -wrap-its-text-by-a-max-width/3194997 # 3194997) –

6

HTML을 JLabel 안에 넣고이를 수행하기 위해 linebreak 태그를 사용할 수 있습니다.

9

기본적으로 스윙은 텍스트를 줄 바꿈하지 않습니다. JLabel에 크기를 지정하면 텍스트의 일부분 만 칠하고 끝에 "..."을 추가합니다.

제안 된대로 HTML을 사용하여 줄 바꿈 기능을 사용할 수 있습니다. 그러나, 나는 실제로 이것을 구현하기 위해 이전에 사용자 지정 Swing UI 대리자를 만들었습니다. MultiLineLabelUI.

사용 가능한 공간에 맞게 텍스트를 줄 바꿈하고 단단한 줄 바꿈도 고려합니다. 당신이 그것을 시도하기로 선택한 경우,이만큼 간단하다 :

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

또는 대안 포장뿐만 아니라 텍스트가 수직 및 수평 텍스트 정렬을 지원하는 사용자 정의 MultiLineLabel 클래스를 사용합니다.

UPDATE

나는 원래 코드 샘플 도메인을 잃었다. 대신 이제 github에서 볼 수 있습니다 : https://github.com/sasjo/multiline

+0

내부적으로 HTML을 사용하고 있습니까? – Pacerier

+0

@Pacerier : 포장 된 텍스트에 효과를 칠할 필요가 없으므로 불가능합니다. JTextArea와 비슷한 방법으로 텍스트를 깨뜨릴 수 있다고 말할 수 있습니다. –

+1

@ SamuelSjöberg broken Link'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

좋은 생각이지만 한 가지 단점이 있습니다. 서식있는 텍스트를 사용할 수 없습니다. – Robert

0

레이블의 최대 너비를 지정할 수 없지만 구체적인 너비를 지정할 수 있습니다. JLabel의 현재 폭을 측정함으로써 우리는 단지 JLabels의 폭이 우리의 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에 대한 '환상적인'지원을 제공하지 않지만 단순한 용도로 사용할 수 있습니다. 당신이 더 동적으로, 당신은 HTML 내부에 폭 CSS 또는 너비 속성을 사용할 수 원하는 경우

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