如何获得具有多行功能的JLabel? HTML真的是唯一的方法吗? - java

我认为答案是“你做不到”,但是我对Swing并不了解很多。所以:

我需要在矩形中显示只读的多行文本,每个字符都没有魔术解释,大小足以容纳它。能够选择一个区域(并从中复制)是一个加号。

到目前为止失败的方法:

JLabel("a\nb");根本不起作用,我无法想象为什么,因为这应该是唯一正确的答案。已记录JLabel以显示其所处理的文本。但显然不是换行符。

JLabel还有一个可怕的问题:如果文本恰巧以<html>开头,它将再次不显示所处理的文本,而是将其重新解释为HTML。文档不仅没有提及这一点,而且现在我遇到的问题是,如果允许用户输入显示在JLabel中的文本(确实如此),他们可能会坚持使用格式标签并引起各种麻烦(并且他们会)。

我没有办法关闭它。为了准确显示给定的文本,我必须预先将文本做完整的HTML引用,再将\ n更改为<br>,然后将其全部包装在<html>...</html>中。我在核心Java中找不到引用的任何内容-显然您必须编写自己的代码或依赖apache之类的其他库? Recommended method for escaping HTML in Java有很多理由不依赖这里的第三方库。现在我的Java代码将包含一个HTML布局引擎,以便我可以可靠地显示文本?我非常想避免这种无证且脆弱的骇客行为。

JTextArea将处理多行文本,并且可以将其设置为只读。但是我看不到如何告诉它缩小到仅容纳文本所需的大小。 (JLabel至少正确地做到了这一点。[编辑:还是不-我回到了JLabel,现在标签在它们的行中居中或扩展到完整大小-我显然在某处缺少设置])我认为一定有一种告诉它停止扩展以填充行的方法,但是我该怎么办? setSize(1,1)不这样做。我觉得正确的答案是走这条路,但我需要一个指针来使其自动调整为最小尺寸。

还是有一些更好的组件呢?有没有一种方法可以将文本字符串呈现为最小尺寸的图像?我可以在JLabel中显示它...

我还试图避免扫描所有文本并组成一个左对齐的JLabel垂直框,每行一个-可能,但是绝对比我想要的复杂(当有一个更简单的解决方案时)。

请注意,我无法对任何组件的大小进行硬编码。组件描述由服务器生成并交付给应用程序,该应用程序根据运行时的描述生成小部件,并将其添加到Box容器中。服务器无法以像素为单位进行计算;我需要依靠Swing来简单地基于Box中事物的顺序进行布局。而且在大多数情况下,这意味着小部件必须占用其最小可能的大小。

我如何?

按照指示,我尝试了这一点。只有一个窗格出现,并且没有边框,所以我看不到它将占用多少空间。

import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.BorderFactory; 
import javax.swing.border.Border;

public class MainTextPane {
    public static void main(final String[] args) {
        Border loweredbevel = BorderFactory.createLoweredBevelBorder();

        final JTextPane pane = new JTextPane();
        pane.setText("Hello, this is a\ntwo lined string!");
        final JTextPane pane2 = new JTextPane();
        pane2.setText("Next!");
        pane.setBorder(loweredbevel); //no effect
        pane2.setBorder(loweredbevel); //no effect


        final JFrame frame = new JFrame("TextPane with new lines.");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(pane);
        frame.getContentPane().add(pane2); //clobbered previous pane
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

参考方案

只需使用JTextPane即可。如果需要首选大小,请随时(在设置文本之后)调用JEditorPane。您可以将其设置为可编辑或不可编辑,并轻松地从中复制粘贴,它将处理新行。如果您以简单的方式使用它,则不必太复杂:

import javax.swing.JFrame;
import javax.swing.JTextPane;

public class MainTextPane {
    public static void main(final String[] args) {
        final JTextPane pane = new JTextPane();
        pane.setText("Hello, this is a\nnew lined string! Hope JTextPane is what we are looking for here.");

        final JFrame frame = new JFrame("TextPane with new lines.");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(pane);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

但是,如果要使用任意文本加载它,我建议在getPreferredSize()中使用它,并根据需要设置JScrollPane的首选大小。

还测试了JScrollPane,它不会像JEditorPane那样简单。

如果您有更多要求,请在评论中告诉我们或更新您的问题。

编辑1

关于您提供的代码,您看到第一个窗格掩盖了第二个窗格,因为您将它们都添加到了内容窗格中,而没有设置JTextPane。例如,尝试将LayoutManager设置为LayoutManager(这会将两个窗格彼此相邻放置)。

根据斜角边框,我可以清楚地看到它,但是确实有些细,所以这可能就是为什么您没有看到它的原因。我也运行了您提供的代码,该代码是可见的,但并不容易。无论如何,请尝试以下代码:

import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.BorderFactory; 
import javax.swing.border.Border;

public class MainTextPane {
    public static void main(final String[] args) {
        Border loweredbevel = BorderFactory.createLoweredBevelBorder();

        final JTextPane pane = new JTextPane();
        pane.setText("Hello, this is a\ntwo lined string!");
        final JTextPane pane2 = new JTextPane();
        pane2.setText("Next!");
        pane.setBorder(loweredbevel);
        pane2.setBorder(loweredbevel);


        final JFrame frame = new JFrame("TextPane with new lines.");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new FlowLayout()); //Added this line of code...
        frame.getContentPane().add(pane);
        frame.getContentPane().add(pane2);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

Java Swing SearchBox模型 - java

我需要使用Java Swing的搜索框,如果单击任何建议,当输入字母时它将显示来自数据库的建议,它将执行一些操作。如果有可能在Java swing中,请提供源代码提前致谢 java大神给出的解决方案 您可以使用DefaultComboBoxModel,输出将是这样。Try this在此代码中,您将找到countries数组,因此您需要从数据库中获取此数组。

Java-如何使Jtextfield充满整个框架 - java

我正在尝试使JTextArea填充整个框架,因此它看起来有点像记事本或textedit。也可以有一个滚动窗格。提前致谢!编辑:JTextArea 参考方案 试试这个 - -import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JTextField; public…

Swing-典型桌面应用程序中的并发 - java

这可能是一个广泛的问题,但我想知道单用户桌面应用程序通常在何处使用并发。您如何发现理想情况下(在设计阶段)并发问题?附注:从操作系统理论上来说,并发问题通常发生在无法共享资源(例如打印机)的情况下。不过,我仍然对在编程级别上可能发生的情况感到迷惑。 java大神给出的解决方案 Event Dispatch thread与其他逻辑之间的Swing中可能存在线程…

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…