최대 너비를 설정하여 JLabel을 텍스트로 감싸십시오.


답변:


55

아니.

레이블에 HTML을 사용할 수 있지만 중단 태그를 하드 코딩해야합니다.

더 나은 방법은 JTextArea를 사용하고 랩핑을 켜는 것입니다. 텍스트의 배경, 전경, 글꼴 등을 변경하여 레이블처럼 보이게 할 수 있습니다.

이 답변은 Java 7 이상에서 구식입니다.

@darren의 답변에 따라 문자열을 <html></html>태그 로 감싸기 만하면됩니다 .

myLabel.setText("<html>"+ myString +"</html>");

중단 태그를 하드 코딩 할 필요가 없습니다. 구성 요소의 크기가 조정되면 텍스트가 줄 바꿈됩니다.


14
그것은 전적으로 사실이 아닙니다. HTML을 사용하는 경우 중단 태그를 하드 코딩 할 있지만 HTML을 사용하고 최대 크기를 할당하면 텍스트가 자동으로 줄 바꿈됩니다.
Daniel Rikowski

2
태그를 하드 코딩하기로 결정한 경우 Java 5가 후자를 좋아하지 않으므로 <br />이 아닌 <br>을 사용해야합니다.
Craigo

두 번째 아이디어가 마음에 듭니다. 첫 번째 아이디어는 단어를 반으로 나누고 내가 원하는 것은 줄 바꿈입니다
shareef

"레이블에 HTML을 사용할 수 있지만 중단 태그를 하드 코딩해야합니다." 이것은 잘못된 것입니다. CSS는 선호하는 너비를 지정할 수 있으며, 그러면 문자열이 필요한만큼 자동으로 단어를 줄 바꿈합니다.
Andrew Thompson

45

예, 두 가지 유사한 방법이 있습니다 (첫 번째는 css style = "width : ... px", 두 번째는 html WIDTH = ....... :

1.

labelText = String.format("<html><div style=\"width:%dpx;\">%s</div></html>", width, text);

2.

labelText = String.format("<html><div WIDTH=%d>%s</div></html>", width, text);

5
html을 사용하여 텍스트 줄 바꿈을 만드는 모든 것은 해킹처럼 느껴지지만 작동하는 가장 쉬운 방법입니다. div에서 크기를 설정하는 것은 타사 라이브러리 또는 지나치게 복잡한 해킹없이 JLabel을 최대 너비로 랩핑하는 데 필요한 것입니다.
피터 돌 버그

6
창 크기가 변경되면 어떻게됩니까? 텍스트는 새 레이블 너비에 따라 리플 로우되어야하지만이 솔루션을 사용하면 다시 설정해야합니다.
Andrii Chernenko

1
</html>btw :)
Jiří

35

또는 단순히 사용

myLabel.setText("<html>"+ myString +"</html>");

JDK 7로 충분했습니다. 감사합니다! JLabel lblTitle = new JLabel("<html>My very very very long title text</html>");
Matthieu

4
이렇게하면의 모든 HTML 엔티티 myString가 먼저 이스케이프 되었는지 확인해야합니다 . myString"값 <5"와 같은 경우 "값 5"로 나타납니다.
Rangi Keen 2015

12

대신 단락 태그를 사용하는 경우 하드 코딩 구분 태그없이 HTML을 사용할 수 있습니다.

JLabel biglabel = new JLabel("<html><p>A lot of text to be wrapped</p></html>");

어떤 이유로 이것은 나를 위해 작동하지 않았습니다. 제목 뒤에 p- 태그가 있고 텍스트는 줄 바꿈되지 않습니다. 가로 스크롤을 사용하지 않도록 설정 했으므로 그와 관련이있을 수 있습니다.
Bram Vanroy

p 태그는 필요하지 않습니다.
Erick Robertson


7

여기에 좋은 기술이 있습니다 . 기사의 끝으로 스크롤하십시오.

JLabel labelBeingUsed = myLabel;
View view = (View) labelBeingUsed.getClientProperty(BasicHTML.propertyKey);
view.setSize(scrollPane1.getWidth(), 0.0f);
float w = view.getPreferredSpan(View.X_AXIS);
float h = view.getPreferredSpan(View.Y_AXIS);
labelBeingUsed.setSize((int) w, (int) h);

7

텍스트를 <html>태그로 감싸는 것 외에 선호하는 높이를 존중하고 너비를 최대로 설정하는 컨테이너에 라벨을 넣어야합니다. 예를 들어, 레이블을 NORTH에 넣을 수 있습니다.BorderLayout .

다음은이를 설명하기위한 간단하지만 완전한 작업 프로그램입니다. 원하는 방식으로 프레임 크기를 조정할 수 있습니다. 레이블은 전체 너비를 차지하고 높이는 그에 따라 텍스트를 감싸도록 조정됩니다. 내가하는 일은 <html>태그를 사용 하고 레이블을 BorderLayout.

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import java.awt.Dimension;

public class LabelWrap {

    public static JPanel createPanel() {
        JLabel label = new JLabel();
        label.setText("<html>"
            + "<h3>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h3>"
            + "<p>Duis a tincidunt urna. Phasellus tristique interdum mauris, "
            + "ut vestibulum purus suscipit eget. Aenean massa elit, accumsan "
            + "non faucibus vel, dictum placerat urna. In bibendum est sagittis "
            + "urna iaculis quis sagittis velit commodo. Cum sociis natoque "
            + "penatibus et magnis dis parturient montes, nascetur ridiculus "
            + "mus. Nam quis lacus mauris. Phasellus sem libero, convallis "
            + "mattis sagittis vel, auctor eget ipsum. Vivamus molestie semper "
            + "adipiscing. In ac neque quis elit suscipit pharetra. Nulla at "
            + "orci a tortor consequat consequat vitae sit amet elit. Praesent "
            + "commodo lacus a magna mattis vehicula. Curabitur a hendrerit "
            + "risus. Aliquam accumsan lorem quis orci lobortis malesuada.</p>"
            + "<p>Proin quis viverra ligula. Donec pulvinar, dui id facilisis "
            + "vulputate, purus justo laoreet augue, a feugiat sapien dolor ut "
            + "nisi. Sed semper augue ac felis ultrices a rutrum dui suscipit. "
            + "Praesent et mauris non tellus gravida mollis. In hac habitasse "
            + "platea dictumst. Vestibulum ante ipsum primis in faucibus orci "
            + "luctus et ultrices posuere cubilia Curae; Vestibulum mattis, "
            + "tortor sed scelerisque laoreet, tellus neque consectetur lacus, "
            + "eget ultrices arcu mi sit amet arcu. Nam gravida, nulla interdum "
            + "interdum gravida, elit velit malesuada arcu, nec aliquam lectus "
            + "velit ut turpis. Praesent pretium magna in nibh hendrerit et "
            + "elementum tellus viverra. Praesent eu ante diam. Proin risus "
            + "eros, dapibus at eleifend sit amet, blandit eget purus. "
            + "Pellentesque eu mollis orci. Sed venenatis diam a nisl tempor "
            + "congue.</p>"
            + "</html>");

        JPanel panel = new JPanel(new BorderLayout());
        panel.add(label, BorderLayout.NORTH);
        panel.setPreferredSize(new Dimension(640, 480));
        return panel;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() { 
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setContentPane(createPanel());
                frame.pack();
                frame.setVisible(true);
            }

        });
    }

}

0

<html>포장은 작동하지만 모든 경우에 적용되는 것은 아닙니다. 부모 컨테이너가 FlowLayout을 사용하면 작동하지 않습니다. 따라서 BoxLayout으로 설정했습니다. 이 코드 스 니펫을보십시오.

javax.swing.JPanel pRefundNote = new javax.swing.JPanel(); 
javax.swing.JLabel lbNote = new javax.swing.JLabel();

pRefundNote.setAlignmentX(0.0F); 
pRefundNote.setMaximumSize(new java.awt.Dimension(32767, 33)); 
pRefundNote.setLayout(new javax.swing.BoxLayout(pRefundNote, javax.swing.BoxLayout.X_AXIS)); 

lbNote.setText("<html>Select items using Shift or Ctrl and Up/Down keys or Mouse</html>"); 
lbNote.setVerticalAlignment(javax.swing.SwingConstants.TOP);
lbNote.setVerticalTextPosition(javax.swing.SwingConstants.TOP); 
pRefundNote.add(lbNote);

<br>부모 프레임과 pRefundNote 컨테이너를 확대하더라도 텍스트가 깨질 수 있으므로 추가하지 마십시오 .


-7

이 접근 방식을 시도 할 수있는 것보다 JLabel 만 사용하려면

하위 문자열 방법을 사용하여 레이블에 표시하려는 문자 수를 표시하십시오.

public void setLabel(String label){
    String dispLabel=label.substring(0, numOfCharacter);
    labelComponent.setText(dispLabel);
}

이것은 텍스트 줄 바꿈이 아닙니다.
SapuSeven
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.