web-dev-qa-db-ja.com

JLabelに「ワードラップ」プロパティはありますか?

JLabelにテキストを表示しています。基本的には、そのテキストを動的に生成し、次にHTMLタグ(BRBなど)を適用してテキストをフォーマットします。最後に、このフォーマットされたテキストをJLabelに割り当てます。

これで、メモ帳の「ワードラップ」機能のように、Jlabelが画面の最後に到達したときにテキストを次の行に自動的にラップするようにします。

どうやってやるの?

47
Jame

テキストを<html>...</html>でラップすると機能するはずです

PDATE:おそらく最大サイズも設定する必要があります。

29
MarianP

HTMLスタイル(CSS)を使用して、bodyの幅を設定できます。これにより、レンダリングする行数が決定され、そこからラベルの優先高さが決定されます。

CSSで幅を設定することで、ラベル内で改行が発生する場所(または最適なサイズ)を計算する必要がなくなります。

import javax.swing.*;

public class FixedWidthLabel {

    public static void main(String[] srgs) {
        final String s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eu nulla urna. Donec sit amet risus nisl, a porta enim. Quisque luctus, ligula eu scelerisque gravida, tellus quam vestibulum urna, ut aliquet sapien purus sed erat. Pellentesque consequat vehicula magna, eu aliquam magna interdum porttitor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed sollicitudin sapien non leo tempus lobortis. Morbi semper auctor ipsum, a semper quam elementum a. Aliquam eget sem metus.";
        final String html = "<html><body style='width: %1spx'>%1s";

        Runnable r = () -> {
            JOptionPane.showMessageDialog(
                    null, String.format(html, 200, s));
            JOptionPane.showMessageDialog(
                    null, String.format(html, 300, s));
        };
        SwingUtilities.invokeLater(r);
    }
}

enter image description hereenter image description here

92
Andrew Thompson

1つの方法は、JTextAreaの代わりにJLabelを使用し、setWrapStyleWordsetLineWrapをtrueに設定し、外観と動作を設定することです。 JLabel(境界線を削除し、不透明にせず、編集およびフォーカス不可にします)。

そうでなければ、JLabelを絶対に使用する必要がある場合は、FontMetricsを使用してテキストを測定し、空白を確認してから、適切な位置にHTMLハードブレークを追加する必要があります。

このソリューションが最も簡単で、サイズ変更でも正しく機能することがわかりました。 <html>タグでテキストをラップする以外に、希望する高さを尊重し、幅を最大に設定するコンテナにラベルを配置する必要もあります。たとえば、ラベルをBorderLayoutのNORTHに配置できます。

これを説明するためのシンプルだが完全な作業プログラムを以下に示します。任意の方法でフレームのサイズを変更できます。ラベルは幅全体を占め、それに応じてテキストを折り返すように高さが調整されます。私がしているのは、<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);
            }

        });
    }

}
7
Andrei Vajna II