JScrollPane неправильно растягивает горизонтальное расстояние в GridBagLayout

Я видел другие посты на эту тему, но найденные ими решения не относятся ко мне. Я устанавливаю взвешенное значение и использую c.fill = GridBagConstraints.BOTH ограничения также.

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

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

Мой результат:

GridBagLayout результат

import java.awt.*;
import javax.swing.*;

public class TestCode extends JFrame {
    JTextArea textArea = new JTextArea ();
    JComboBox <String> typeComboBox;
    JTextField searchField;
    JTextField fileField;

    public TestCode(){

        setTitle ("GUI Test");
        setSize (600, 300);
        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        setVisible (true);

        JScrollPane scrollPane = new JScrollPane(textArea);

        JButton readButton = new JButton("Read File");
        JButton displayButton = new JButton("Display");
        JButton searchButton = new JButton("Search");


        searchField = new JTextField(10);
        fileField = new JTextField(15);

        typeComboBox = new JComboBox <String> ();
        typeComboBox.addItem("Index");
        typeComboBox.addItem("Type");
        typeComboBox.addItem("Name");




        JPanel container = new JPanel();
            container.setLayout(new GridBagLayout());
            container.setPreferredSize(new Dimension(250, 100));
        JPanel filePanel = new JPanel();
            filePanel.setLayout(new BoxLayout(filePanel, BoxLayout.Y_AXIS));
            filePanel.add(new JLabel("Source file", SwingConstants.LEFT));
                JPanel filePanelTop = new JPanel();
                    filePanelTop.setLayout(new FlowLayout(FlowLayout.LEFT));
                    filePanelTop.add(fileField);
                JPanel filePanelBottom = new JPanel();
                    filePanelBottom.setLayout(new FlowLayout(FlowLayout.RIGHT));
                    filePanelBottom.add(readButton);
                    filePanelBottom.add(displayButton);
            filePanel.add(filePanelTop);
            filePanel.add(filePanelBottom);
            filePanel.setMaximumSize(filePanel.getPreferredSize());
            filePanel.setBorder(BorderFactory.createTitledBorder("Import File"));
        JPanel searchPanel = new JPanel(); 
            searchPanel.setLayout(new BoxLayout(searchPanel, BoxLayout.Y_AXIS));
            searchPanel.add(new JLabel("Search target", SwingConstants.LEFT));
                JPanel searchPanelTop = new JPanel();
                    searchPanelTop.setLayout(new FlowLayout(FlowLayout.LEFT));
                    searchPanelTop.add(searchField);
                    searchPanelTop.add(typeComboBox);
            searchPanel.add(searchPanelTop);
            searchPanel.add(searchButton);
            searchPanel.setMaximumSize(searchPanel.getPreferredSize());
            searchPanel.setBorder(BorderFactory.createTitledBorder("Search Objects"));

          GridBagConstraints c = new GridBagConstraints();
          c.gridx = 0;
          c.gridy = 0;
          container.add(filePanel, c);
          c.gridx = 0;
          c.gridy = 1;
          container.add(searchPanel, c);
          c.gridx = 1;
          c.gridy = 0;
          c.weightx = 1.0;
          c.weighty = 1.0;
          c.gridwidth = GridBagConstraints.REMAINDER;
          c.gridheight = GridBagConstraints.REMAINDER;
          c.fill = GridBagConstraints.BOTH;
          c.anchor = GridBagConstraints.NORTHWEST;
          container.add(scrollPane, c);

        add(container, BorderLayout.WEST);

        validate();

    } // end method toString

    public static void main(String[] args){
        TestCode run = new TestCode();
    }
} // end class Treasure

1 ответ

Решение
//add(container, BorderLayout.WEST);
add(container);

Запад противопоставляет компоненты их предпочтительной ширине. По умолчанию используется ЦЕНТР, который позволяет компонентам расширяться для заполнения доступного пространства.

Кроме того, основная структура вашего кода неверна. Сначала вы должны добавить все компоненты в фрейм, а затем вызвать:

frame.pack();
frame.setVisible(true);

Тогда нет необходимости для validate().

Другие вопросы по тегам