tạo một JLabel bọc văn bản của nó bằng cách đặt chiều rộng tối đa


Câu trả lời:


55

Không.

Bạn có thể sử dụng HTML trong nhãn, nhưng sau đó bạn phải viết mã cứng cho thẻ ngắt.

Một cách tiếp cận tốt hơn là sử dụng JTextArea và bật gói. Bạn có thể thay đổi nền, nền trước, phông chữ, v.v. của văn bản để làm cho nó giống như một nhãn.

Lưu ý, câu trả lời này đã lỗi thời với ít nhất là Java 7.

Theo câu trả lời của @ darren, bạn chỉ cần quấn chuỗi bằng <html></html>các thẻ:

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

Bạn không cần phải mã hóa bất kỳ thẻ ngắt nào. Văn bản kết thúc khi thành phần thay đổi kích thước.


14
Điều đó không hoàn toàn đúng. Nếu sử dụng HTML, bạn có thể mã hóa cứng các thẻ ngắt, nhưng nếu bạn sử dụng HTML và chỉ định kích thước tối đa, văn bản sẽ tự động được bao bọc.
Daniel Rikowski

2
Nếu bạn quyết định sử dụng thẻ ngắt mã cứng, hãy đảm bảo rằng bạn sử dụng <br> chứ không phải <br />, vì Java 5 không thích thẻ sau.
Craigo

tôi thích ý tưởng thứ hai vì ý tưởng đầu tiên có thể ngắt một từ thành một nửa và điều tôi muốn là gói từ
shareef

"Bạn có thể sử dụng HTML trong nhãn, nhưng sau đó bạn phải viết mã cứng cho thẻ ngắt." Cái này sai. CSS có thể chỉ định chiều rộng ưa thích, sau đó chuỗi sẽ tự động quấn trên word thành nhiều dòng nếu cần.
Andrew Thompson

45

Có, có hai cách tương tự (đầu tiên với css style = "width: ... px", thứ hai với 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
Toàn bộ vấn đề về việc sử dụng html để làm cho text wrap giống như một cuộc tấn công, nhưng đó là cách dễ nhất để làm cho nó hoạt động. Đặt kích thước trong div là chính xác những gì tôi cần để làm cho JLabel bọc với chiều rộng tối đa mà không có bất kỳ thư viện bên thứ 3 nào hoặc các bản hack quá phức tạp.
Peter Dolberg

6
Điều gì sẽ xảy ra nếu kích thước cửa sổ thay đổi? Văn bản phải được thu gọn lại theo chiều rộng nhãn mới, nhưng với giải pháp này, bạn sẽ phải đặt lại.
Andrii Chernenko

1
</html>btw :)
Jiří

35

hoặc đơn giản là sử dụng

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

Với JDK 7, điều đó là đủ, cảm ơn! JLabel lblTitle = new JLabel("<html>My very very very long title text</html>");
Matthieu

4
Nếu bạn làm điều này, bạn nên đảm bảo rằng mọi thực thể HTML trong myStringđều được thoát trước. Nếu myStringlà một cái gì đó như "Giá trị <5", nó sẽ xuất hiện dưới dạng "Giá trị 5".
Rangi Keen

12

Bạn có thể sử dụng HTML mà không có thẻ ngắt đoạn mã hóa cứng nếu bạn sử dụng thẻ đoạn văn.

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

Vì một số lý do mà điều này không hiệu quả với tôi. thẻ p theo sau một tiêu đề và văn bản không được bao bọc. Tôi đã tắt tính năng cuộn ngang nên có lẽ điều đó có liên quan đến nó.
Bram Vanroy

Bạn không cần thẻ p.
Erick Robertson


7

Có một kỹ thuật hay ở đây , hãy cuộn đến cuối bài viết.

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

Ngoài việc gói văn bản trong <html>thẻ, bạn cũng phải đặt nhãn vào một vùng chứa tôn trọng chiều cao ưa thích và đặt chiều rộng thành tối đa. Ví dụ, bạn có thể đặt nhãn vào BẮC của a BorderLayout.

Đây là một chương trình làm việc đơn giản nhưng đầy đủ để minh họa điều này. Bạn có thể thay đổi kích thước khung theo bất kỳ cách nào bạn muốn; nhãn sẽ chiếm toàn bộ chiều rộng và chiều cao sẽ điều chỉnh phù hợp để bọc văn bản. Lưu ý rằng tất cả những gì tôi đang làm là sử dụng <html>các thẻ và đặt nhãn ở BẮC của 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>gói hoạt động nhưng không phải trong mọi trường hợp. Nếu vùng chứa mẹ sử dụng FlowLayout thì nó sẽ không hoạt động. Do đó tôi đặt nó thành BoxLayout. Nhìn vào đoạn mã này:

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

Đừng thêm <br>vì nó sẽ phá vỡ văn bản của bạn ngay cả khi bạn phóng to khung chính và vùng chứa pRefundNote.


-7

Nếu bạn chỉ muốn sử dụng JLabel, bạn có thể thử cách tiếp cận này,

chỉ hiển thị số ký tự bạn muốn hiển thị trên nhãn bằng phương pháp chuỗi con.

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

Đây không phải là gói văn bản.
SapuSeven 07/08/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.