2012-03-23 95 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);