为什么JTextArea小?

问题描述 投票:0回答:1

我尝试在SWING中制作一个简单的应用程序:使用JFrame上的BorderLayout布局,在SOUTH上放置一个执行按钮,在WEST上包含一个组合框的面板上,在EAST上包含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的Dimension,但是没有成功。

screenshot of results

java swing layout-manager jtextarea
1个回答
1
投票

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

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

首先,使用JTextAreacolumnrows属性。这将使显示文本以适应这些限制所需的空间量更好地“猜测”。

第二,使用GridBagConstraints#fill覆盖GridBagLayout并强制其利用可用空间

Fill the 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));

并使用JScrollPane代替LineBorder

© www.soinside.com 2019 - 2024. All rights reserved.