Расположите JPanels сверху ScrollPane, не по центру

1

Следующий код воспроизводит мою проблему как SSCCE. Я хочу создать вертикальный прокручиваемый список JPanels внутри JScrollPane. Мой фактический код выравнивает JPanels в центре, но он должен быть выровнен вверху. Как я могу это сделать, любая помощь приветствуется.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class TestingWindow {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.setBounds(100, 100, 150, 200);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JScrollPane scrollPane = new JScrollPane();
                frame.getContentPane().add(scrollPane, BorderLayout.CENTER);

                JPanel panel = new JPanel();
                GridBagLayout gbl_panel = new GridBagLayout();
                panel.setLayout(gbl_panel);
                scrollPane.setViewportView(panel);

                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridwidth = GridBagConstraints.REMAINDER;
                gbc.anchor = GridBagConstraints.NORTH;
                gbc.weightx = 1;

                gbc.fill = GridBagConstraints.HORIZONTAL;

                JPanel panelToAdd = new JPanel();
                JLabel label = new JLabel("Test 1");
                panelToAdd.setBackground(Color.blue);
                panelToAdd.add(label);
                panelToAdd.setAlignmentY(Component.TOP_ALIGNMENT);
                panel.add(panelToAdd, gbc, -1);
                panel.revalidate();

                JPanel panelToAdd2 = new JPanel();
                JLabel label2 = new JLabel("Test 2");
                panelToAdd2.setBackground(Color.green);
                panelToAdd2.add(label2);
                panel.add(panelToAdd2, gbc, -1);
                panel.revalidate();

                JPanel panelToAdd3 = new JPanel();
                JLabel label3 = new JLabel("Test 3");
                panelToAdd3.setBackground(Color.yellow);
                panelToAdd3.add(label3);
                panel.add(panelToAdd3, gbc, -1);
                panel.revalidate();
                frame.setVisible(true);
            }
        });
    }

}

Решение на основе решения @MadProgrammer:

Добавьте следующий код для создания невидимого компонента в конце:

    GridBagConstraints gbc_finish = new GridBagConstraints();
    gbc_finish.gridwidth = GridBagConstraints.REMAINDER;
    gbc_finish.anchor = GridBagConstraints.NORTH;
    gbc_finish.weighty = 1;
    JPanel panelToAdd4 = new JPanel();
    panelToAdd4.setOpaque(false);
    panel.add(panelToAdd4, gbc_finish, -1);
    panel.revalidate();
  • 1
    Вы можете добавить «пустой» компонент в конец и установить связанное свойство gridy GridBagConstraints gridy 1 , это немного грязно, если у вас динамический пользовательский интерфейс. Вы также можете рассмотреть возможность использования VerticalLayout из проекта SwingX
  • 0
    Спасибо, решение, включающее невидимый компонент наполнителя, работает отлично. Я ожидал решения Java-Out-of-the-Box, поэтому я не думал об этом. Я разместил рабочий SSCCE выше!
Показать ещё 1 комментарий
Теги:
user-interface
swing
jscrollpane
jpanelmenu

2 ответа

0

Один из вариантов может заключаться в том, чтобы добавить filler JPanel в конце panel со следующими ограничениями:

    GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 2;
    gridBagConstraints.weighty = 1.0;
    panel.add(new JPanel(), gridBagConstraints);
  • 0
    Спасибо за Ваш ответ. @MadProgrammer разместил это решение в комментарии ранее. Но код "gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2;" не имеет смысла, поскольку он использует REMAINDER и index = -1 (в методе Component # add (....)) для создания новой строки для каждого добавляемого компонента.
0

Вы пытались помещать их в северную панель вашей границы?

frame.getContentPane().add(scrollPane, BorderLayout.NORTH);
  • 0
    Это просто поместит полосу прокрутки в верхнем направлении, а также предотвратит заполнение полосы прокрутки полным пространством. Но я хочу, чтобы панели внутри панели прокрутки были выровнены по верху, а не сама панель прокрутки

Ещё вопросы

Сообщество Overcoder
Наверх
Меню