Почему JTextArea мало? - PullRequest
       25

Почему JTextArea мало?

0 голосов
/ 07 ноября 2019

Я пытаюсь сделать простое приложение на SWING: используя макет BorderLayout на JFrame, я надеваю SOUTH исполняющую кнопку, на WEST панель, которая содержит комбинированный список, и на EAST панель, которая содержит 2 JTextAreas. Проблема в том, что оба JTextArea чертовски малы. Мы будем рады любой помощи и объяснениям.

Это код панели с двумя текстовыми областями

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,у) но безуспешно. Я пытался использовать JTextArea (строки, столбцы), но безуспешно. Я использовал даже setPreferredSize с измерением, но безуспешно.

screenshot of results

1 Ответ

2 голосов
/ 07 ноября 2019

Вероятной причиной вашей проблемы является то, что область контейнера меньше предпочтительного размера текстовой области, вместо этого GridBagLayout по умолчанию будет иметь минимальный размер.

Это хороший пример того, почему выследует избегать непосредственной установки этих свойств и вместо этого использовать диспетчер макета и свойства компонентов.

Для начала используйте свойства JTextArea s column и rows. Это позволит лучше «угадать» количество места, необходимого для отображения текста, чтобы поместиться в этих пределах.

Во-вторых, используйте 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 sвместо LineBorder

...