2012-10-11 44 views
1

我知道這thread顯示了一種方法來做,但它導致我的情況下奇怪的行爲,我想知道是否沒有簡單方式來做到這一點。如何爲JTextArea行計數換行?

我需要知道設置文字後我的JTextArea將具有的尺寸。以下是我目前的工作方式:

tarea.getLineCount() * tarea.getRowHeight(); 

它工作除非沒有換行。我想通過換行進行相同的計算。有沒有人知道什麼時候換行?這樣我只需要將當前行數加1。

編輯:

這裏是(可能)的溶液中,我發現。這幾乎是@camickr的this的複製粘貼。

int rowStartOffset = textComponent.viewToModel(new Point(0, 0)); 
int endOffset = textComponent.viewToModel(new Point(0, textComponent.getHeight())); 

int count = 0; //used to store the line count 
while (rowStartOffset < endOffset) { 
    try { 
     rowStartOffset = Utilities.getRowEnd(textComponent, rowStartOffset) + 1; 
    } catch (BadLocationException ex) { 
     break; 
    } 
    count++; 
} 

我做了幾個測試/無線包裝啓用,它似乎工作。

+0

如果不進行編輯,使用多線'JLabel'。 –

+0

有人會把你釘在十字架上:-) – mKorbel

+0

@mKorbel有多嚴重?我做錯了什麼?但是,謝謝,我會考慮使用多行jlabel。 – nathan

回答

0

在我看來,只要你有沒有做過呼籲文本區域setPreferredSize,在getPreferredSize方法應該給你,你沒有麻煩尋找什麼......

這是爲什麼你不應該打電話setPreferredSize做佈局的東西。首選大小應該由組件計算(例如,設置文本時)。

讓我知道如果我錯過了點;)

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

public class CalculateTextAreaSize extends Box{ 

    public CalculateTextAreaSize(){ 
     super(BoxLayout.Y_AXIS); 

     final JTextArea text = new JTextArea("I've\nGot\nA\nLovely\nBunch\nof\nCoconuts!\n"); 

     JScrollPane pane = new JScrollPane(text); 

     add(pane); 

     JButton button = new JButton("Set Text!"); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       text.insert("Longish string - how long will it be?", text.getDocument().getLength()); 
       //The size it will be once everything is figured out 
       System.out.println(text.getPreferredSize()); 
       //The size it is now because no rendering has been done 
       System.out.println(text.getSize()); 
      } 
     }); 
     add(button); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(new CalculateTextAreaSize()); 
     frame.validate(); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

}