Запуск GridBagLayout из верхнего левого угла в Java Swing
Я новичок в Java Swing, и я изо всех сил пытался запустить GridBagLayout из верхнего левого угла, чтобы c.gridx=0 c.gridy=0 поместит мой объект в верхний левый угол.
Я был бы признателен, если бы вы могли помочь мне, сказав, что мне нужно сделать после этого момента:
JPanel panel = new JPanel(new GridBagLayout());
frame.add(panel);
GridBagConstraints c = new GridBagConstraints();
Я знаю, что должен использовать константы NORTHWEST или FIRST_LINE_START, но я не знаю, как. Я пытался сделать это таким образом, но он не понимал константы.
frame.getContentPane().add(panel, BorderLayout.NORTHWEST);
спасибо ваша помощь.
6 ответов
вы должны использовать GridBagConstraints
' anchor
собственность. Это должно сделать это за вас:
frame.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.NORTHWEST;
frame.add(panel, gbc);
Я не гарантирую, что вам не придется устанавливать другие свойства объекта ограничений, чтобы получить желаемый макет. В частности, вам может потребоваться установить widthx
и widthy
на 1
так, что панель займет все доступное пространство, данное ей.
прочитайте раздел из учебника Swing на Как использовать GridBagLayout. Сектон на "weightx, weighty" гласит:
если вы не укажете хотя бы одно ненулевое значение для weightx или weighty, все компоненты сгруппируются в центре своего контейнера.
для тех, кто использует IDE (например, NetBeans), я, наконец, нашел хороший трюк: если вы хотите добавить компоненты сверху и использовать их предпочтительные размеры: добавьте еще одну пустую панель с weighty = 1.0. Скопировано из автоматически сгенерированного кода (NetBeans):
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.weighty = 1.0;
jPanelOptions.add(jPanelFiller, gridBagConstraints);
быстрый и простой способ:
добавьте пустую JLabel в конец страницы:
// your code goes here
gbc.weightx = 1;
gbc.weighty = 1;
bg.add(new JLabel(" "), gbc); // blank JLabel
Если вы хотите, чтобы сетка шла до самого верха, просто установите все свои весовые = 0 до последнего элемента, установите его на любое число больше 0, он будет эффективно нажимать остальные кнопки на вершину.
Не забудьте также увеличить значение сетки вашей кнопки.
в противном случае он будет по центру. (то же самое можно сделать с помощью значения gridx и weightx, если вы не используете c.fill = GridBagConstraints.Горизонтальное свойство.)
есть обходной путь. Вы можете поместить панель GridBagLayout в панель BorderLayout с BorderLayout.СЕВЕРНЫЙ. После этого компонент в панели GridBagLayout начнет от верхнего положения.
static void test4(){
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(480, 360);
JPanel borderLayoutPanel=new JPanel(new BorderLayout());
JPanel gridBagLayoutPanel = new JPanel(new GridBagLayout());
borderLayoutPanel.add(gridBagLayoutPanel, BorderLayout.NORTH);
frame.add(borderLayoutPanel);
JButton testButton=new JButton("test button");
GridBagConstraints c = new GridBagConstraints();
c.gridx=0;
c.gridy=0;
gridBagLayoutPanel.add(testButton, c);
frame.setVisible(true);
}