为什么 JTextArea 很小?

Why JTextArea is small?

我尝试在 SWING 中制作一个简单的应用程序:在 JFrame 上使用 BorderLayout 布局,我在南边放了一个执行按钮,在西边放了一个包含组合框的面板,在东边放了一个包含 2 个 JTextAreas 的面板。问题是,两个 JTextArea 都太小了。欢迎任何帮助和解释。

这是带有 2 个文本区域的面板的代码

package cipher;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.border.Border;

class TextPanel extends JPanel {

    private JTextArea inputArea, outputArea;

    public TextPanel() {

        initSize();
        initTextArea();
        initBorder();
        initLayout();

        packing();

    }

    private void packing() {

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.weighty = 1;
        add(inputArea,gbc);
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.weightx = 1;
        gbc.weighty = 1;
        add(outputArea,gbc);

    }

    private void initBorder() {

        Border outer = BorderFactory.createEmptyBorder(5, 5, 5, 5);
        Border inner = BorderFactory.createTitledBorder("Text");
        setBorder(BorderFactory.createCompoundBorder(outer,inner));

    }

    private void initLayout() {

        setLayout(new GridBagLayout());

    }

    private void initTextArea() {

        inputArea = new JTextArea();
        inputArea.setPreferredSize(new Dimension(385,400));

        outputArea = new JTextArea();
        outputArea.setPreferredSize(new Dimension(385,400));

    }

    private void initSize() {

        Dimension size = getPreferredSize();
        size.width = 390;
        setPreferredSize(size);

    }

}

我试过使用 setSize(x,y) 但没有成功。我试过使用 JTextArea(rows,columns) 但没有成功。我什至对维度使用了 setPreferredSize,但没有成功。

您的问题的可能原因是容器区域小于文本区域的首选大小,GridBagLayout 将改为默认为最小大小。

这是一个很好的例子,说明了为什么您应该避免直接设置这些属性,而是使用布局管理器和组件属性。

首先,使用 JTextAreacolumnrows 属性。这将使 "guess" 显示文本以适应这些限制所需的 space 数量。

其次,使用GridBagConstraints#fill覆盖GridBagLayout并强制它使用可用的space

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TextPanel());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TextPanel extends JPanel {

        private JTextArea inputArea, outputArea;

        public TextPanel() {

            initTextArea();
            initBorder();
            initLayout();

            packing();

        }

        private void packing() {

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.weightx = 1;
            gbc.weighty = 1;
            gbc.fill = GridBagConstraints.BOTH;
            add(inputArea, gbc);
            gbc.gridx = 0;
            gbc.gridy = 1;
            gbc.weightx = 1;
            gbc.weighty = 1;
            gbc.fill = GridBagConstraints.BOTH;
            add(outputArea, gbc);

        }

        private void initBorder() {

            Border outer = BorderFactory.createEmptyBorder(5, 5, 5, 5);
            Border inner = BorderFactory.createTitledBorder("Text");
            setBorder(BorderFactory.createCompoundBorder(outer, inner));

        }

        private void initLayout() {

            setLayout(new GridBagLayout());

        }

        private void initTextArea() {

            // The borders are just here so you can see the different text areas
            inputArea = new JTextArea(10, 20);
            inputArea.setBorder(new LineBorder(Color.BLACK));
            outputArea = new JTextArea(10, 20);
            outputArea.setBorder(new LineBorder(Color.BLACK));

        }

    }
}

我也要改...

inputArea = new JTextArea(10, 20);
inputArea.setBorder(new LineBorder(Color.BLACK));
outputArea = new JTextArea(10, 20);
outputArea.setBorder(new LineBorder(Color.BLACK));

并使用 JScrollPanes 而不是 LineBorder