Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可扩展区域_Java_Swing_Jtextarea_Jtextcomponent - Fatal编程技术网

Java 可扩展区域

Java 可扩展区域,java,swing,jtextarea,jtextcomponent,Java,Swing,Jtextarea,Jtextcomponent,我正在构建的应用程序的一部分要求我在某种类型的不可编辑组件中显示可变数量的文本。目前,这已在JTextArea中实现,但JTextArea只有设置组件垂直大小的setRows 我想要的是一个可以扩展到所需大小的组件。这并不构成问题,因为嵌入此内容的面板是可滚动的。它不必在任何特定的时间都显示出来,但必须是可见的。而且我不希望滚动条中的滚动条,我认为这是讨厌的。< /P> 哪种Swing组件最适合这些要求 注意:我之所以在这里问这个问题,是因为整个$%^&*Oracle Java文档站点(包括所有

我正在构建的应用程序的一部分要求我在某种类型的不可编辑组件中显示可变数量的文本。目前,这已在JTextArea中实现,但JTextArea只有设置组件垂直大小的setRows

我想要的是一个可以扩展到所需大小的组件。这并不构成问题,因为嵌入此内容的面板是可滚动的。它不必在任何特定的时间都显示出来,但必须是可见的。而且我不希望滚动条中的滚动条,我认为这是讨厌的。< /P> 哪种Swing组件最适合这些要求


注意:我之所以在这里问这个问题,是因为整个$%^&*Oracle Java文档站点(包括所有Swing演示和教程)现在似乎已关闭。

Emm。。。如果您不想输入文本,则不需要JTextArea。。。只需使用JLabel即可显示一些文本;JLabel支持html文本格式,因此您可以像这样轻松地使用它

...

JPanel aPanel=new JLanel(new FlowLayout());
JLabel aLabel=new JLabel();
aPanel.add(aLabel);


void showFormattedText(String html)
{
 aLabel.setText(html);
}

...
<html>
Put some text<br>
...<br>

</html>
正如您可能猜到的,格式化文本可以是这样的任何内容

...

JPanel aPanel=new JLanel(new FlowLayout());
JLabel aLabel=new JLabel();
aPanel.add(aLabel);


void showFormattedText(String html)
{
 aLabel.setText(html);
}

...
<html>
Put some text<br>
...<br>

</html>
。。。但这不是一个最终解决方案,而是一个基本概念。我希望这是有帮助的


祝你好运

我已经为此管理了一个工作原型,解决了原始问题中的动态调整大小问题。添加更多文本时,文本区域的大小将调整为足以容纳文本。显然,使用setEditablefalse可以停止文本编辑。希望它能给你一些想法

设置文本 将列计数更改为近似值-这里我使用了字符总数的平方根*一个任意因子。 不是文字区域的宽度是合理的,但是我们仍然需要固定高度。 将首选大小设置为较低的值-这将强制重新计算 将“首选高度”设置为“最小高度”-这是根据内容的最小边界框计算得出的。 代码


谢谢我继承了这段代码,这就是他们使用的代码。但是,我同意您的看法,JTextArea是不必要的,因为它没有编辑功能。不过,我理解您的意思,因为这是html,如果我不在其中添加标记,JLabel是否会足够聪明,能够像html页面那样自行拆分行并添加行?我显示的文本只是在其他地方输入的随机字符串。打破词语界限是否足够聪明?如果是这样,那么这正是我所需要的。把一些文本使用样式,而不是硬线分隔符。这样,文本可以根据需要换行到下一行,而不会出现任何复杂情况。请参阅。@SteveCohen否,HTML内容不会自动换行。请看我使用CSS修复的示例。如果它是基于web的应用程序,则以html格式传输数据非常有用;虽然你说我想要的是一个可以扩展到所需尺寸的组件。那么size max应该是它的内容行长度限制,对吗?就好像您将要显示一条消息,因为它使用了所有格式?因此,您需要捕获以前输入的所有格式。。。当然,你可以让你的文本依赖于JLabel宽度,为它添加CSS,但是如果你想让JLabel依赖于文本行长度,你可以为你的应用创建一个类似迷你解析器的东西。。。。。。例如,您可以捕获每个\n字符并将其替换为。这是一个非常简单的代码;我只是开始它的基础。。。看我的答案
JFrame frame = new JFrame();
GroupLayout gLayout = new GroupLayout(frame.getContentPane());
frame.getContentPane().setLayout(gLayout);

final JTextArea area = new JTextArea();
area.setEditable(false);
area.setLineWrap(true);
area.setWrapStyleWord(true);

JButton button = new JButton("Add more");
button.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        area.setText(area.getText()
                + "apple banana carrot dingo eagle fox gibbon ");

        // set approx number of cols
        int chars = area.getText().length();
        int cols = (int) Math.round(Math.sqrt(chars) * 1.3);
        area.setColumns(cols);

        // force recalculation
        area.setPreferredSize(new Dimension(25, 25));

        // downsize
        area.setPreferredSize(new Dimension(
                area.getPreferredSize().width,
                area.getMinimumSize().height));

    }
});

ParallelGroup hGroup = gLayout
        .createParallelGroup()
        .addComponent(button)
        .addComponent(area, GroupLayout.PREFERRED_SIZE,
                GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE);
gLayout.setHorizontalGroup(hGroup);

SequentialGroup vGroup = gLayout
        .createSequentialGroup()
        .addComponent(button)
        .addComponent(area, GroupLayout.PREFERRED_SIZE,
                GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE);
gLayout.setVerticalGroup(vGroup);

frame.setSize(600, 500);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

frame.invalidate();
frame.validate();
frame.setVisible(true);