如何限制自动调整大小的textArea的高度

时间:2011-06-24 17:49:01

标签: java swing jscrollpane jtextarea autoresize

我有几个垂直对齐的文本区域。我希望它们随着更多文字的输入而扩展,但是限制它们的高度。

我已尝试设置最大尺寸,但这似乎被忽略了。有什么想法吗?

    _recipients = new JTextArea();
    _recipients.setBorder( BorderFactory.createEtchedBorder() );
    _recipients.setLineWrap( true );
    _recipients.setWrapStyleWord( true );
    _recipients.setMaximumSize( new Dimension( 111, 55 ) );

    _subject = new JTextArea();
    _subject.setBorder( BorderFactory.createEtchedBorder() );
    _subject.setLineWrap( true );
    _subject.setWrapStyleWord( true );
    _subject.setMaximumSize( new Dimension( 111, 55 ) );

    //JComponent area = LAF.Area.clear(  );
    JPanel area = new JPanel( new GridLayout( 1, 2, 6, 0 ) );
    area.setOpaque( false );
    area.add( _recipients );
    area.add( _subject );

    add( area, BorderLayout.CENTER );

我收到建议,我应该使用滚动疼痛,但这只是创建了一个不可编辑的区域

        JScrollPane pain = new JScrollPane();
        pain.add( _recipients );
        area.add( pain );

        pain = new JScrollPane();
        pain.add( _subject );
        area.add( pain );

修改

没有更多,但

public class TestFrame extends JFrame
{
  TestFrame()
  {
    setSize( new DimensionUIResource( 800, 668 ) );
    JPanel area = new JPanel( new FlowLayout( 0, 0, 0 ) );

    Stuff thing = new Stuff();
    area.add( thing );

    add( area );
  }

  public static void main( String args[] )
  {
    TestFrame frame = new TestFrame();
    frame.show();
  }

  private static class Stuff extends JComponent
  {
    private final JTextArea _subject;

    Stuff()
    {
        setLayout( new BorderLayout() );

        _subject = new JTextArea();
        _subject.setBorder( BorderFactory.createEtchedBorder() );
        _subject.setLineWrap( true );
        _subject.setWrapStyleWord( true );
        _subject.setSize( new Dimension( 111, 55 ) );
        _subject.setMaximumSize( new Dimension( 111, 55 ) );

        JPanel area = new JPanel( new GridLayout( 1, 2, 6, 0 ) );
        area.setOpaque( false );
        area.add( _subject );

        add( area, BorderLayout.CENTER );
      }
  }
}

1 个答案:

答案 0 :(得分:2)

就个人而言,我不想限制我的JTextArea的大小,以免我阻止用户根据需要添加尽可能多的信息。再一次,我觉得你最好不要在JScrollPane中包装JTextArea并限制JScrollPane的vewport大小。这可以通过告诉JTextArea开始有多少行和列来显式或隐式地完成。例如:

import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.*;

public class TestPanel extends JPanel {

   private static final int AREA_COUNT = 4;

   public TestPanel() {
      setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
      setLayout(new GridLayout(0, 1, 0, 5));
      for (int i = 0; i < AREA_COUNT; i++) {
         JTextArea area = new JTextArea(5, 30);
         area.setLineWrap(true);
         area.setWrapStyleWord(true);
         JPanel wrapPanel = new JPanel(new BorderLayout());
         wrapPanel.add(new JLabel("JTextArea " + i), BorderLayout.PAGE_START);
         wrapPanel.add(new JScrollPane(area), BorderLayout.CENTER);
         add(wrapPanel);
      }
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("TestPanel");
      frame.getContentPane().add(new TestPanel());
      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();
         }
      });
   }
}
相关问题