Как ограничить высоту автоматического изменения размера JTtextArea - PullRequest
2 голосов
/ 24 июня 2011

У меня несколько текстовых областей выровнены по вертикали.Я хочу, чтобы они расширялись по мере того, как набирается больше текста, но ограничиваю их высоту.

Я пытался установить максимальный размер, но это, кажется, игнорируется.Любые идеи?

    _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 Ответ

2 голосов
/ 25 июня 2011

Лично я предпочитаю не ограничивать размер моего JTextArea, чтобы пользователь не мог добавить столько информации, сколько необходимо. Опять же, я чувствую, что вам лучше обернуть JTextArea в JScrollPane и ограничить размер вьюпорта JScrollPane. Это можно сделать явно или неявно, указав 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();
         }
      });
   }
}
...