繁体   English   中英

JLabel 将纯文本包装为 JTextArea

[英]JLabel wrapping plain text as JTextArea

我对JLabel和纯文本包装有问题。 对于纯文本换行,我使用的是LabelView ,但我对它给我的结果不是很满意。

我的目标是获得纯文本换行,例如JTextArea 我试过WrappedPlainView但它只适用于JTextComponent

所以我的问题是你们可能知道/或有一些预先的JLabel视图?

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

标签视图: 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`s 并且我使用 LabelView 作为纯文本。

所以我的问题是也许你们知道/或有一些预先的 JLabel 观点,

有两种方式,

  • 使用 JTextComponent

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

.

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

  • 邮政和SSCCE

编辑:

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

对于JTextComponentsjavax.swing.text.Xxx需要使用初始PreferredSize ,请参阅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) 将 JLabel 与 Html 一起使用(减少并实现了 up_to 版本 Html3.2),以及其他变体

一个非常古老的线程,但万一有人再次遇到这个问题......

这些解决方案似乎都不适合我(也许是因为包含我的 JLabel 的 JPanel 被 JScrollPane 查看了?),而且我无法让 JTextAreas 工作,因为它有一些繁琐的错误,它在增长但不会“ t 收缩。

相反,这是我能找到的最简单的 JLabel 包装文本解决方案,由 Tony Fecteau 在此页面上提供:只需在 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");

我也同意@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 />换行。

希望这可以帮助!

试试这个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM