автоматическое динамическое расширение / сжатие JTextArea в Java - PullRequest
2 голосов
/ 10 мая 2011

Я начинаю с создания JTextArea определенного размера.Пользователь может добавить в него текст, но он будет обрезан, если он станет слишком длинным (вертикально или горизонтально).Я хочу, чтобы JTextArea автоматически расширялась или сжималась (для удаления текста).

Я могу разрешить пользователям изменять шрифт и размер шрифта в будущем, поэтому было бы хорошо, если бы я мог избежать увеличения или уменьшения размерана определенный размер.

В настоящее время я использую границы для определения размера моей JTextArea.Может быть, мне следует определить размер по строкам и столбцам, использовать слушателя и действовать соответствующим образом?

заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 10 мая 2011

Я второй совет, чтобы просто поместить JTextArea в JScrollPane и позволить этому позаботиться о дополнительном тексте.Кроме того, и, возможно, самое главное, не устанавливает границы JTextArea , потому что если вы делаете это, вы ограничиваете его до определенного размера, а это не то, чего вы хотите, чтобы это произошло.Вместо этого инициализируйте вашу JTextArea двумя константами int, чтобы представить количество строк и столбцов, которые должны быть визуализированы, а затем поместите его в JScrollPane.Также обязательно ознакомьтесь с использованием менеджеров компоновки, чтобы избежать установки размера JScrollPane!

Редактировать: при тестировании кажется, что setPreferredSize более опасен для JTextArea, чем setSize.

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();
         }
      });
   }
}
2 голосов
/ 10 мая 2011

Я не могу себе представить, почему вы хотите это сделать, почему бы не поместить 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 голосов
/ 30 мая 2011

также см. GrowingTextAreaExample

...