2012-02-21 73 views
5

這是我第一次使用任何StackExchange網站,所以讓我們看看它是怎麼回事。當JTextArea超過一定數量的行時啓用滾動條

所以我一直在用Java創建一個'本地'聊天程序,並使用JTextField進行聊天輸入。但我想允許多線聊天,所以我切換到JTextArea。我正在使用GroupLayout(使用Window Builder Pro - eclipse構建),以便輕鬆調整窗口/組件大小。這裏有一個畫面:

enter image description here

JTabbedPane的,對的JTextArea和發送按鈕都包含在一個JPanel,和所有的東西向左是在它自己的JPanel。所以我有JTextArea和按鈕停靠在右側JPanel的底部。 JTextArea允許垂直調整大小,但按鈕不是。 我是能夠得到當我輸入新線的JTextArea垂直成長,下面顯示:

enter image description here

但我無法想出一個辦法,這樣,如果我輸入一定量的線成JTextArea,滾動條會出現並阻止JTextArea佔用更多的空間。 所以我試圖在JScrollPane中包裝JTextArea,但最初禁用滾動條,然後在我需要JTextArea開始滾動時啓用它們,但我知道如果我包裝它,JScrollPane不會增長,但仍然會像它那樣操作滾動條可見,但沒有它們。 :/

**我想在這裏把一個鏈接,但StackOverflow上不喜歡我;)

所以,我有點卡住...... 是否有東西做這個,我」失蹤了? 我在想我可以創建兩個不同的GroupLayout對象,其中一個的scrollpane甚至不是有效的,然後其他的scrollpane是有效的,但是會停留在一定的大小。在keyPress監聽器上,我可以檢查文本區域是否超過了某個限制,然後它會切換面板的佈局?內部的JTextArea仍然是同一個對象,但只是不同的佈局對象。關於這種方法的意見?

無論如何,先謝謝所有花時間回答這個問題的人。 :)

回答

8

我寫了一個小程序,只使用Swing控件

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.border.EmptyBorder; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 

public class ResizeTextArea { 

    public static final int CHAT_ROW_LIMIT = 4; 

    public static void main(String[] args) { 
     JPanel topPanel = new JPanel(); 
     topPanel.setPreferredSize(new Dimension(200, 200)); 
     topPanel.setBackground(Color.WHITE); 

     final JTextArea chatArea = new JTextArea(); 
     final JScrollPane scrollPane = new JScrollPane(chatArea); 

     final JPanel mainPanel = new JPanel(new BorderLayout(5,5)); 
     mainPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     mainPanel.add(topPanel, BorderLayout.CENTER); 
     mainPanel.add(scrollPane, BorderLayout.SOUTH); 

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

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

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

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

      private void updateLineCount() { 
       int lineCount = chatArea.getLineCount(); 
       if (lineCount <= CHAT_ROW_LIMIT) { 
        chatArea.setRows(lineCount); 
        mainPanel.revalidate(); 
       } 
      } 
     }); 

     JFrame f = new JFrame("ResizeTextArea"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(mainPanel); 
     f.pack(); 
     f.setVisible(true); 
    } 
} 

這裏是如何尋找1號線,4號線和8號線調整大小的JTextArea中最多的4線:

1 line4 lines8 lines

+0

謝謝soooo多! 我使用了DocumentListener代碼並對GroupLayout進行了一些自定義修改,並且它的工作方式類似於一個魅力:D – 2012-02-22 03:08:45

+0

對於'DocumentListener'爲+1;另請參閱此相關的[示例](http://stackoverflow.com/q/15039652/230513)。 – trashgod 2013-02-23 15:50:51

+0

我知道這個問題在5年內還沒有被激活,但是參考你的回答,@ughzan,'revalidate()'代碼是否也可以在JScrollPane或任何其他JTextArea的父級元素中工作? – Ryan 2017-03-02 15:08:37

2

您可以將一個DocumentFilter添加到jTextArea的Document。在篩選器中檢查您的jTextArea的行數,並根據行計數值允許/防止添加文本。