最大幅を設定して、JLabelでテキストを折り返すようにします


回答:


55

番号。

ラベルにはHTMLを使用できますが、その場合はbreakタグをハードコーディングする必要があります。

より良いアプローチは、JTextAreaを使用してラッピングをオンにすることです。テキストの背景、前景、フォントなどを変更して、ラベルのように見せることができます。

この回答は、少なくともJava7では古くなっていることに注意してください。

ダレンの答え@あたりとして、あなたは単純にして、文字列をラップする必要がある<html></html>タグ:

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

ブレークタグをハードコーディングする必要はありません。コンポーネントのサイズが変更されると、テキストが折り返されます。


14
それは完全に真実ではありません。HTMLを使用している場合は、breakタグをハードコーディングできます、HTMLを使用して最大サイズを割り当てると、テキストは自動的に折り返されます。
Daniel Rikowski 2011

2
ブレークタグをハードコーディングする場合は、Java 5が後者を好まないため、<br/>ではなく<br>を使用するようにしてください。
クレイゴ2011

私は2番目のアイデアが好きです。最初のアイデアは単語を半分に
分割

「ラベルにHTMLを使用できますが、その場合はbreakタグをハードコーディングする必要があります。」これは間違っています。CSSで希望の幅を指定すると、文字列が自動的に必要な数の行に折り返されます。
Andrew Thompson

45

はい、2つの同様の方法があります(最初はcss style = "width:... px"を使用し、2番目はhtml WIDTH = .......を使用します:

1.1。

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

2.2。

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

5
htmlを使用してテキストを折り返すことはすべてハックのように感じますが、それを機能させる最も簡単な方法です。divでサイズを設定することは、サードパーティのライブラリや過度に複雑なハッキングなしでJLabelを最大幅でラップするために必要なものです。
Peter Dolberg 2012年

6
ウィンドウサイズが変更された場合はどうなりますか?新しいラベル幅に応じてテキストをリフローする必要がありますが、このソリューションでは、テキストを再設定する必要があります。
Andrii Chernenko 2013

1
</html>ところで:)
Jiří2018

35

または単に使用する

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

十分だったJDK7で、ありがとう! JLabel lblTitle = new JLabel("<html>My very very very long title text</html>");
マシュー2013年

4
これを行う場合は、のHTMLエンティティmyStringが最初にエスケープされていることを確認する必要があります。myStringが「値<5」のような場合は、「値5」と表示されます。
ランギキーン2015年

12

代わりに段落タグを使用すると、ブレークタグをハードコーディングせずにHTMLを使用できます。

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

どういうわけか、これは私にとってはうまくいきませんでした。見出しに続くpタグ、およびテキストは折り返されません。私は水平スクロールを無効にしているので、おそらくそれはそれと関係があります。
Bram Vanroy 2016年

pタグは必要ありません。
エリックロバートソン


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>タグでラップする以外に、希望の高さを尊重し、幅を最大に設定するコンテナにラベルを配置する必要もあります。たとえば、ラベルをの北に配置でき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 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.