Я довольно новичок в Swing. У меня есть приложение, которое динамически генерирует пользовательский интерфейс на основе внешнего ввода. В верхней части панели есть JLabel с текстом заголовка, а затем кнопка (которая сообщает приложению перезагрузить динамически сгенерированный материал), а затем ниже, это JScrollPane, который содержит все динамически сгенерированные вещи. Я хочу, чтобы метка и кнопка занимали столько вертикального пространства, сколько им нужно, а затем панель прокрутки, чтобы заполнить все оставшееся свободное пространство.Как получить JScrollPane, чтобы заполнить все оставшееся свободное пространство
Я использую GridBagLayout и устанавливаю gbc.fill = BOTH, прежде чем добавить панель прокрутки.
Я собрал SSCCE, и когда он впервые загружается, окно выглядит точно так, как я хочу. Но если я изменил размер окна меньше, я ожидаю, что scrollpane будет продолжать потреблять все свободное пространство и появляться полосы прокрутки. Но вместо этого происходит то, что, как только я уменьшаю окно даже на один пиксель, прокрутка становится крошечной, ее содержимое едва видно.
Я нашел How to get a JScrollPane to resize with its parent JPanel, но это не работает, если JScrollPane не является единственным дочерним, так сказать.
Что я делаю неправильно?
SSCCE:
public class SwingTest {
public static void main(String[] args) {
JPanel bigPanel = new JPanel();
bigPanel.setLayout(new GridLayout(10, 10));
for (int i = 0; i < 100; i++) {
bigPanel.add(new JCheckBox("Item " + i));
}
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
JFrame mainWindow = new JFrame("Swing Test");
mainWindow.setLayout(new GridBagLayout());
mainWindow.add(new JLabel("Heading"), gbc);
mainWindow.add(new JButton("Button"), gbc);
gbc.fill = GridBagConstraints.BOTH;
mainWindow.add(new JScrollPane(bigPanel), gbc);
mainWindow.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
mainWindow.setLocationByPlatform(true);
mainWindow.pack();
mainWindow.setVisible(true);
}
}
* «Итак, я понял это при написании моего SSCCE. (Забавно, как это происходит!)» * Хотя это может быть смешно, это также довольно часто. Это одно из (многих) преимуществ составления краткого примера. Это уменьшает большие, казалось бы сложные проблемы, вплоть до основных проблем, что, в свою очередь, облегчает просмотр проблем и решений. Рад, что вы его отсортировали.:) –
Макет по умолчанию для области содержимого JFrame - это BorderLayout, поэтому нет необходимости в выражении 'mainWindow.setLayout (новый BorderLayout());' – FredK
@AndrewThompson «Забавно, как это происходит!» должен был указать на это. Я обсуждал просто не публикацию, но мне потребовалось некоторое время, чтобы понять это, поэтому я решил не разрешать мне работать, а мой SSCCE пропадает. :) – JakeRobb