JTextArea 在 Java 中的自动动态扩展/收缩



我首先创建一个特定大小的JTextArea。用户可以在其中添加文本,但如果文本变得太长(垂直或水平),它将被切断。我希望 JTextArea 自动扩展或收缩(用于删除文本)。

我可能会允许用户将来更改字体和字体大小,所以如果我能避免使东西增加/减少一定大小,那就太好了。

我目前正在使用边界来调整我的 JTextArea 的大小。也许我应该按行和列调整大小并使用侦听器并采取适当的行动?

提前感谢!

我无法想象你为什么要这样做,为什么不在 JScrollPane 中放一个 JTextArea,但好吧,我会一起玩......也许是这样的:

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);
    }
}

我建议简单地将JTextArea放在JScrollPane中,并让它处理额外的文本。另外,也许最重要的是,不要设置 JTextArea 的边界,因为如果你这样做,你会限制它为一定的大小,这不是你想要发生的。相反,使用两个 int 常量初始化 JTextArea,以表示应可视化的行数和列数,然后将其放置在 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();
         }
      });
   }
}

另请参阅GrowingTextAreaExample

相关内容

  • 没有找到相关文章

最新更新