2012-02-21 11 views
5

これは私の初めてのStackExchange Webサイトです。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のが私を好きではない。だから、

)、私は一種のこだわっている... は、私は「これを行うものがあります私は行方不明? 私は、2つの異なるGroupLayoutオブジェクトを作成できると考えていました.1つは有効なスクロールペインで、もう1つはスクロールペインで有効ですが特定のサイズでスタックされたオブジェクトです。 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行を探す方法ですを使用して4行の最大までJTextAreaのサイズを変更し、小さなプログラムを書きました

1 line4 lines8 lines

+0

ありがとうsoooo! DocumentListenerコードを使用して、GroupLayoutにカスタム変更を加えました。これは、魅力的に機能します。D –

+0

+1 for 'DocumentListener';関連する[example](http://stackoverflow.com/q/15039652/230513)も参照してください。 – trashgod

+0

私はこの質問が5年間でアクティブではないことを知っていますが、あなたの答え、@ughzanを参照すると、 'revalidate()'コードはJScrollPaneやJTextAreaの親である他の要素でも動作しますか? – Ryan

2

jTextAreaのドキュメントにDocumentFilterを追加できます。 INでjTextAreaのフィルタチェック行数を設定し、行カウント値に応じてテキストの追加を許可/禁止します。

関連する問題