2012-03-23 70 views
0

部分我建立需求的应用程序,我显示在某种形式的不可编辑分量可变量的文字。目前这已经在JTextArea中实现,但JTextArea只有setRows()来设置组件的垂直大小。可扩展的JTextArea

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

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

(注:?我只是问这在这里,因为整个#$%^ & *甲骨文Java文档的网站,包括所有的摇摆演示和教程似乎现在是向下)。

回答

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)); 
} 

...这是不是虽然最终的解决方案,但一个基础概念。我希望这是有益的

好运

+0

感谢。我继承了这些代码,这就是他们使用的。但是,我同意你的看法,即不需要编辑JTextArea。只是让我理解你,因为如果我不把
标记放入JLabel中,那么JLabel就足够聪明,可以自行拆分这些行,并根据需要添加行(如html页面)?我所显示的文字只是随机输入的字符串。它能够足够聪明地打破文字界限吗?如果是这样,那么这就是我所需要的。 – 2012-03-23 20:44:30

+0

'放一些文字
'使用样式而不是强硬的换行符。这样,文本可以根据需要包装到下一行,而没有任何复杂性。请参阅[示例](http://stackoverflow.com/a/7861833/418556)。 – 2012-03-23 20:53:53

+0

@SteveCohen不,HTML内容不会自动换行。看到我的例子使用CSS来解决这个问题。 – 2012-03-23 20:54:48

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);