0

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

我想要的是一个可以扩展到所需大小的组件。这不会造成问题,因为嵌入这个东西的面板是可滚动的。它不必在任何特定时间全部出现,但它必须是可见的。(而且我不希望滚动条内有滚动条,我认为这是可憎的。

什么 Swing 组件最适合这些要求?

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

4

2 回答 2

0

我已经为此管理了一个工作原型,以解决原始问题中的动态调整大小问题。随着更多文本的添加,文本区域的大小将调整为足够大以包含文本。显然使用 setEditable(false) 来停止编辑文本。希望它会给你一些想法。

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

代码

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);
于 2012-03-23T21:35:56.680 回答
0

嗯...如果您不想输入文本,则不需要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>

我希望你有这个概念

...

迷你解析器 - 未测试

  String getFormattedText(String text)
{
  char commonBR='\n';
  String htmlBR="<br>";
  char check;
  String result="";

  for(int i=0; i<text.length(); i++)
  {
      check=text.charAt(i);
      if(check==commonBR)

    {

    result+=htmlBR;
    continue;
    }

    result+=check;

     }

     return result;

    }

...

void test
{
       String text="Hello world \n Hello World once again \n ...and again ";

       System.out.println(this.getFormattedText(text));
}

...虽然它不是最终解决方案,但它是一个基本概念。我希望它有帮助

祝你好运

于 2012-03-23T20:26:56.177 回答