Следующий код воспроизводит мою проблему как 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();
Один из вариантов может заключаться в том, чтобы добавить filler JPanel
в конце panel
со следующими ограничениями:
GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.weighty = 1.0;
panel.add(new JPanel(), gridBagConstraints);
REMAINDER
и index = -1 (в методе Component # add (....)) для создания новой строки для каждого добавляемого компонента.
Вы пытались помещать их в северную панель вашей границы?
frame.getContentPane().add(scrollPane, BorderLayout.NORTH);
gridy
GridBagConstraints
gridy
1
, это немного грязно, если у вас динамический пользовательский интерфейс. Вы также можете рассмотреть возможность использованияVerticalLayout
из проекта SwingX