2011-05-09 67 views
2

我首先創建一個特定大小的JTextArea。用戶可以在其中添加文本,但如果它變得太長(垂直或水平),它將被切斷。我想讓JTextArea自動擴展或縮小(刪除文本)。Java中JTextArea的自動動態擴展/收縮

我可能會允許用戶在將來更改字體和字體大小,所以如果我可以避免使事物增加/減少一定的大小,那將是一件好事。

我正在用bounds來設置我的JTextArea的大小。也許我應該按行和列來調整大小,並使用一個偵聽器並採取適當的行動?

在此先感謝!

回答

2

我無法想象爲什麼你要做到這一點,爲什麼不把一個JTextArea在JScrollPane中,但好的,我會一起玩......也許是這樣的:

import java.awt.Container; 

import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.BadLocationException; 


public class Expander extends JFrame { 

    private final JTextArea area; 
    private int hSize = 1; 
    private int vSize = 1; 

    public Expander() { 
     Container cp = getContentPane(); 
     cp.setLayout(new BoxLayout(cp, BoxLayout.Y_AXIS)); 

     cp.add(Box.createHorizontalGlue()); 
     area = new JTextArea(vSize, hSize); 
     cp.add(area); 
     cp.add(Box.createHorizontalGlue()); 

     area.getDocument().addDocumentListener(new DocumentListener() { 

      @Override 
      public void insertUpdate(DocumentEvent e) { 
       adjust(); 
      } 

      @Override 
      public void removeUpdate(DocumentEvent e) { 
       adjust(); 
      } 

      @Override 
      public void changedUpdate(DocumentEvent e) { 
       adjust(); 
      } 
     }); 

     pack(); 
    } 

    private void adjust() { 
     int maxColumns = getMaxColumns(); 
     if ((area.getLineCount() != vSize) || (maxColumns != hSize)) { 
      hSize = maxColumns; 
      vSize = area.getLineCount(); 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        area.setColumns(hSize); 
        area.setRows(vSize); 
        Expander.this.doLayout(); 
        Expander.this.pack(); 
       } 
      }); 
     } 
    } 

    private int getMaxColumns() { 
     int startOffset = 0; 
     int maxColumns = 0; 
     for (int i = 0; i < area.getLineCount(); i++) { 
      try { 
       int endOffset = area.getLineEndOffset(i); 
       int lineSize = endOffset - startOffset; 
       if (lineSize > maxColumns) { 
        maxColumns = lineSize; 
       } 
       startOffset = endOffset; 
      } catch (BadLocationException ble) { 
      } 
     } 

     return maxColumns; 
    } 

    public static void main(String[] args) { 

     Expander e = new Expander(); 
     e.setLocationRelativeTo(null); 
     e.setVisible(true); 
    } 
} 
+0

謝謝!我需要這種方式,因爲我需要所有文字一次可見。總的來說,我想要有這些「文本塊」,用戶可以移動並與之交互。 – matthieu 2011-05-10 20:59:27

2

我第二個建議是簡單地把JTextArea放在一個JScrollPane中,並讓它處理額外的文本。此外,也許最重要的是,不會設置JTextArea的邊界,因爲如果您這樣做,則會將其限制爲特定大小,這不是您希望發生的情況。而是用兩個int常量初始化您的JTextArea,以表示應該可視化的行和列的數量,然後將其放置在JScrollPane中。另外請務必閱讀使用佈局管理器,以便您可以避免設置JScrollPane的大小!

編輯:在測試中,看起來setPreferredSize比setSize對JTextArea更危險。

import java.awt.Dimension; 
import java.awt.GridLayout; 

import javax.swing.*; 

public class ConstrainedTextArea extends JPanel { 
    private JTextArea textArea1, textArea2, textArea3; 

    public ConstrainedTextArea() { 
     textArea1 = new JTextArea(20, 30); 
     textArea2 = new JTextArea(); 
     textArea3 = new JTextArea(); 

     textArea2.setPreferredSize(new Dimension(300, 300)); 
     textArea3.setSize(textArea3.getPreferredSize()); 

     setLayout(new GridLayout(1, 0)); 
     add(new JScrollPane(textArea1)); 
     add(new JScrollPane(textArea2)); 
     add(new JScrollPane(textArea3)); 
    } 

    private static void createAndShowUI() { 
     JFrame frame = new JFrame("ConstrainedTextArea"); 
     frame.getContentPane().add(new ConstrainedTextArea()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowUI(); 
     } 
     }); 
    } 
} 
+0

謝謝!我需要這種方式,因爲我需要所有文本一次顯示...所以我不能使用滾動條。總的來說,我想要有這些「文本塊」,用戶可以移動並與之交互。 – matthieu 2011-05-10 21:00:27