maksimum genişlik ayarlayarak bir JLabel'in metnini kaydırmasını sağlayın


Yanıtlar:


57

Hayır.

Etikette HTML kullanabilirsiniz, ancak daha sonra kesme etiketini sabit kodlamanız gerekir.

Daha iyi bir yaklaşım, bir JTextArea kullanmak ve kaydırmayı açmaktır. Bir etiket gibi görünmesi için metnin arka planını, ön planını, yazı tipini vb. Değiştirebilirsiniz.

Unutmayın, bu yanıt en az Java 7'den itibaren güncel değildir.

@ Darren'in cevabına göre, dizeyi <html>ve </html>etiketleriyle sarmalamanız yeterlidir :

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

Herhangi bir kesme etiketini sabit kodlamanıza gerek yoktur. Bileşen yeniden boyutlandıkça metin kaydırılır.


14
Bu tamamen doğru değil. HTML kullanarak Eğer yapabilirsiniz HTML kullanmak ve maksimum boyut atarsanız sert kod molası etiketleri, ancak, metin otomatik olarak sarılmış alacak.
Daniel Rikowski

2
Etiketleri kırmaya karar verirseniz, Java 5 ikincisini sevmediğinden <br /> yerine <br> kullandığınızdan emin olun.
Craigo

İkinci fikri beğendim çünkü ilki bir kelimeyi yarıya
indirebilir

"Etikette HTML kullanabilirsiniz, ancak daha sonra kesme etiketini sabit kodlamanız gerekir." Bu yanlış. CSS tercih edilen bir genişliği belirleyebilir, ardından dize otomatik olarak gerektiği kadar satıra sarılır.
Andrew Thompson

45

Evet, iki benzer yol vardır (ilk olarak css style = "width: ... px", ikincisi 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
Metin kaydırma yapmak için html kullanmakla ilgili her şey bir hack gibi geliyor, ancak çalışmasını sağlamanın en kolay yolu bu. Div'deki boyutu ayarlamak, herhangi bir 3. taraf kitaplığı veya aşırı karmaşık hackler olmadan JLabel sargısını maksimum genişlikte yapmak için tam olarak ihtiyacım olan şeydi.
Peter Dolberg

6
Pencere boyutu değişirse ne olur? Metnin yeni etiket genişliğine göre yeniden akıtılması gerekir, ancak bu çözümle metni yeniden ayarlamanız gerekir.
Andrii Chernenko

1
</html>btw :)
Jiří

36

veya sadece kullan

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

JDK 7 ile bu yeterliydi, teşekkürler! JLabel lblTitle = new JLabel("<html>My very very very long title text</html>");
Matthieu

4
Bunu yaparsanız, içindeki tüm HTML varlıklarının önce çıkış myStringyapıldığından emin olmalısınız . Eğer myStringbu bir "Değer 5" olarak görünecektir "Değer <5" gibi bir şeydir.
Rangi Keen

13

Bunun yerine paragraf etiketlerini kullanırsanız, HTML'yi sabit kodlama sonu etiketleri olmadan kullanabilirsiniz.

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

Nedense bu benim için işe yaramadı. Bir başlığı takip eden p etiketleri ve metin kaydırılmaz. Yatay kaydırmayı devre dışı bıraktım, bu yüzden belki bununla bir ilgisi var.
Bram Vanroy

P etiketlerine ihtiyacınız yok.
Erick Robertson


7

Burada iyi bir teknik var , makalenin sonuna gidin.

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

Metni <html>etiketlere sarmaktan başka , etiketi tercih edilen yüksekliğe saygı duyan ve genişliği maksimuma ayarlayan bir kaba koymanız da gerekir. Örneğin, etiketi a'nın KUZEYİNE yerleştirebilirsiniz BorderLayout.

İşte bunu göstermek için basit ama eksiksiz bir çalışma programı. Çerçeveyi istediğiniz şekilde yeniden boyutlandırabilirsiniz; etiket tüm genişliği kaplayacak ve yüksekliği, metni kaydırmak için buna göre ayarlanacaktır. Tüm yaptığımın <html>etiketleri kullanmak ve etiketi 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>sarma işe yarıyor, ancak her durumda değil. Üst kapsayıcı FlowLayout kullanıyorsa, o zaman çalışmayacaktır. Bu nedenle BoxLayout olarak ayarladım. Şu kod parçasına bakın:

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

Katmayın <br>o metin kırarım çünkü sizin üst çerçeve ve pRefundNote kabı büyütmek bile.


-7

Bu yaklaşımı deneyebileceğinizden yalnızca JLabel kullanmak istiyorsanız,

sadece alt dize yöntemini kullanarak etikette görüntülemek istediğiniz karakter sayısını görüntüleyin.

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

Bu, metin kaydırma değildir.
SapuSeven
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.