JLabel将纯文本包装为JTextArea

时间:2013-05-17 09:37:05

标签: java swing jlabel textwrapping

我遇到JLabel问题,并在其中包含纯文本。对于纯文本包装我正在使用LabelView,我对它给我的结果不是很满意。

我的目标是获取纯文本换行,例如JTextArea。我尝试了WrappedPlainView,但它仅适用于JTextComponent

所以我的问题可能是你们知道/或者有一些提前的JLabel观点吗?

注意:我不想在我的纯文本中添加html。

LabelView:http://docs.oracle.com/javase/6/docs/api/javax/swing/text/LabelView.html

WrappedPlainView:http://docs.oracle.com/javase/6/docs/api/javax/swing/text/WrappedPlainView.html

试试这个例子,看看在调整帧大小时单词是如何被包装的:

import javax.swing.*;
import java.awt.*;
public class Example extends JFrame {
private static final String LONG_TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " +
                                        "Ut in enim velit. Nunc posuere purus ac odio dictum auctor. " +
                                        "Vivamus nec sem mi. Curabitur sed iaculis nibh. Proin vel massa augue. " +
                                        "Aenean laoreet, tellus ut vulputate mollis, justo eros ornare tortor, " +
                                        "vitae venenatis turpis augue id purus. In quis pretium justo. " +
                                        "Quisque interdum sem at augue ultrices molestie. " +
                                        "Nulla consectetur magna nec est malesuada sed ultricies diam gravida. " +
                                        "Curabitur luctus, nulla nec pulvinar fringilla, enim turpis luctus tellus, " +
                                        "non auctor diam ligula quis lectus.";

public Example()
{
    JTextArea textArea = new JTextArea(LONG_TEXT);
    textArea.setWrapStyleWord(true);
    textArea.setLineWrap(true);
    textArea.setWrapStyleWord(true);
    textArea.setOpaque(false);
    textArea.setEditable(false);

    add(new JScrollPane(textArea), BorderLayout.CENTER);
    setMinimumSize(new Dimension(100, 100));
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setVisible(true);
}

public static void main(String []args)
{
    new Example();
}
}

看一下这个例子,你会看到JLabel包装单词的问题:

import javax.swing.*;
import java.awt.*;
public class Example extends JFrame {
private static final String LONG_TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " +
                                        "Ut in enim velit. Nunc posuere purus ac odio dictum auctor. " +
                                        "Vivamus nec sem mi. Curabitur sed iaculis nibh. Proin vel massa augue. " +
                                        "Aenean laoreet, tellus ut vulputate mollis, justo eros ornare tortor, " +
                                        "vitae venenatis turpis augue id purus. In quis pretium justo. " +
                                        "Quisque interdum sem at augue ultrices molestie. " +
                                        "Nulla consectetur magna nec est malesuada sed ultricies diam gravida. " +
                                        "Curabitur luctus, nulla nec pulvinar fringilla, enim turpis luctus tellus, " +
                                        "non auctor diam ligula quis lectus.";

public Example()
{
    JLabel label = new JLabel(LONG_TEXT);
    add(label, BorderLayout.CENTER);
    setMinimumSize(new Dimension(100, 100));
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setVisible(true);
}

public static void main(String []args)
{
    new Example();
}
}

所以我们的目标是让JLabel单词包装在JTextArea中。

注意:在实际项目中,我正在使用javax.swing.text.View,我使用LabelView作为纯文本。

4 个答案:

答案 0 :(得分:3)

  

所以我的问题可能是你们知道/或者有所进展   JLabel观点,

有两种方式,

  • 使用JTextComponent

    1. non_editable,setEditable()
    2. 更改setDisabledTextColor()
    3. (仅在需要时)透明度(默认情况下为JLabel)您可以更改不透明度

  • 将JLabel与Html一起使用(缩减并实现up_to版本Html3.2)

  • 发布和SSCCE

编辑:

  

注意:在实际项目中,我正在使用javax.swing.text.View和i   我正在使用LabelView作为纯文本。

要使用初始JTextComponentsjavax.swing.text.XxxPreferredSize需要

,请参阅public JTextArea(String text, int rows, int columns)

添加1)使用JTextComponent

必须有关于

的决定
  • 如果包含在JScrollPane中没有或没有可见的JScrollBar(覆盖MouseScroll)

  • 或简单添加到容器中,我建议使用BorderLayout或GridLayout,然后JTextArea可以调整大小(看起来像),也可以使用容器

  • 可滚动的JComponents将添加到JScrollPane

.

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;

public class ExampleJTextArea extends JFrame {

    private /*static*/ final String LONG_TEXT = "Lorem ipsum dolor sit amet, "
            + "consectetur adipiscing elit. Ut in enim velit. Nunc posuere "
            + "purus ac odio dictum auctor. Vivamus nec sem mi. Curabitur sed "
            + "iaculis nibh. Proin vel massa augue. Aenean laoreet, tellus ut "
            + "vulputate mollis, justo eros ornare tortor, vitae venenatis "
            + "turpis augue id purus. In quis pretium justo. Quisque interdum "
            + "sem at augue ultrices molestie. Nulla consectetur magna nec est "
            + "malesuada sed ultricies diam gravida. Curabitur luctus, nulla "
            + "nec pulvinar fringilla, enim turpis luctus tellus, non auctor "
            + "diam ligula quis lectus.";

    public ExampleJTextArea() {
        JTextArea textArea = new JTextArea(LONG_TEXT, 10, 25);
        textArea.setLineWrap(true);
        textArea.setWrapStyleWord(true);
        textArea.setOpaque(false);
        textArea.setEditable(false);
        textArea.setBorder(new EmptyBorder(10,10,2,2));
        add(/*new JScrollPane(*/textArea/*), BorderLayout.CENTER*/);
        //setMinimumSize(new Dimension(100, 100));
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                ExampleJTextArea exampleJTextArea = new ExampleJTextArea();
            }
        });
    }
}

添加2)use JLabel with Html (reduced and implemented up_to version Html3.2), and another variations

答案 1 :(得分:0)

我同意@mKorbel,有两种方法可以通过JLabel来实现正确的包装词:

a)创建自己的自定义组件,在包装时模拟JLabel样式。

public class CustomWrappedLabel extends JTextArea {
    public CustomWrappedLabel(String text) {
        super(text);
        setBackground(null);
        setEditable(false);
        setBorder(null);
        setLineWrap(true);
        setWrapStyleWord(true);
        setFocusable(false);
    }
}

<强>用法

new CustomWrappedLabel("Hey you've just tried multi-line text!");

确保将行数设置为超过2行以实现所需的行为。 wrappedLabelObj.setRows(2)。使用pack()正确计算父组件的高度。

b)使用html自动处理<html>标记内的包装文字。

new JLabel("<html>Hey you've just tried html multi-line text version!</html>")

您可以使用<br />换行。

希望这有帮助!

答案 2 :(得分:0)

一个非常老的帖子,但万一有人再次遇到这个问题......

这些解决方案似乎都不适用于我(也许是因为包含我的JLabel的JPanel被JScrollPane查看了?),而我无法让JTextAreas工作,因为它有一些令人讨厌的bug但不会缩小。

相反,这是我可以找到的最简单的解决方案,用于在JLabel中包装文本,由Tony Fecteau在this page上提供:只需在html格式的JLabel上使用setPreferredSize(),它就会自动启动成长和萎缩!

panel = new JPanel();
JLabel label = new JLabel("<html>" + "long text to display" + "</html>");
label.setPreferredSize(new Dimension(1, 1)); // this is the key part.
panel.add(label, "grow");

答案 3 :(得分:0)

尝试

jLabel.setText(String.format("<html><body style=\"text-align: justify;  text-justify: inter-word;\">%s</body></html>",LONGTEXT));