Запуск 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);
Спасибо за вашу помощь.
Ответы
Ответ 1
Вам нужно использовать свойство GridBagConstraints
'anchor
. Это должно сделать это за вас:
frame.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.NORTHWEST;
frame.add(panel, gbc);
Я не гарантирую, что вам не придется устанавливать другие свойства объекта ограничений, чтобы получить желаемый макет. В частности, вам может потребоваться установить widthx
и widthy
как 1
, чтобы панель занимала все доступное пространство, предоставленное ему.
Ответ 2
Прочитайте раздел из руководства Swing по Как использовать GridBagLayout. В разделе "Весовые, весомые" говорится:
Если вы не указали хотя бы одно ненулевое значение для weightx или weighty, все компоненты скомпонованы в центре их контейнера.
Ответ 3
Для тех, кто использует IDE (например, NetBeans), я наконец нашел хороший трюк: если вы хотите добавить компоненты в начало и использовать их предпочтительные размеры: добавьте еще одну пустую панель с весомым = 1.0. Скопировано из автоматически сгенерированного кода (NetBeans):
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.weighty = 1.0;
jPanelOptions.add(jPanelFiller, gridBagConstraints);
Ответ 4
быстрый и простой способ:
добавьте пробел JLabel до конца страницы:
// your code goes here
gbc.weightx = 1;
gbc.weighty = 1;
bg.add(new JLabel(" "), gbc); // blank JLabel
Ответ 5
если вы хотите, чтобы сетка прошла весь путь до вершины, просто установите весь свой весомый = 0 до последнего элемента, установите его на любое число, большее 0, оно эффективно нажимает остальные кнопки на верхнюю часть.
Не забывайте также увеличивать значение кнопки.
В противном случае он будет центрирован.
(то же самое можно сделать с использованием значения gridx и weightx, если вы не используете свойство c.fill = GridBagConstraints.HORIZONTAL.)
Ответ 6
Там обходной путь. Вы можете поместить панель GridBagLayout на панель BorderLayout с BorderLayout.NORTH. Компонент в панели 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);
}
![введите описание изображения здесь]()