Почему GridBagLayout центрирует мои компоненты, а не помещает их в угол?
до сих пор мне удалось избежать использования GridBagLayout
(вручную код) как можно больше, но я не мог избежать этого на этот раз, и я читаю учебник солнца GridBagLayout
Пока все идет не очень хорошо. Мне кажется, я чего-то не понимаю.
Например, я пробую следующий код (похожий на тот, что в сообщении SUN):
public class MainFrame extends JFrame {
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainFrame frame = new MainFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame
*/
public MainFrame() {
super();
setBounds(100, 100, 500, 375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container mainContainer = getContentPane();
mainContainer.setLayout(new GridBagLayout());
//add label
JLabel someLabel = new JLabel("Label 1:");
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = 0;
//constraints.anchor = GridBagConstraints.FIRST_LINE_START;
//constraints.weightx = 0.5;
mainContainer.add(someLabel, constraints);
JTextField someText = new JTextField(30);
constraints = new GridBagConstraints();
constraints.gridx = 1;
constraints.gridy = 0;
constraints.weightx = 0.5;
mainContainer.add(someText, constraints);
//
}
}
Я получаю ярлык и текстовое поле один рядом с другим в центр кадра.
Но я был ожидая, что они появятся в верхнем левом углу, так как gridx и gridy равны 0 для метки.
Даже если я установлю constraints.anchor = GridBagConstraints.FIRST_LINE_START;
все тот же результат.
Я ошибаюсь?
С поста солнца:
укажите строку и столбец в левом верхнем углу компонента. Этот самый левый столбец имеет адрес gridx=0, а верхняя строка имеет адрес gridy=0.
5 ответов
добавить constraints.weighty = 1;
к ограничениям JLabel и constraints.anchor = GridBagConstraints.NORTHWEST;
к ограничениям текстового поля.
EDIT:
из Oracle руководство GridBagLayout:
большие числа указывают, что строка или столбец компонента должны получить больше места. Для каждого столбца вес связан с наибольшим weightx, указанным для компонента в этом столбце, при этом вес каждого многоколоночного компонента каким-то образом разделяется между столбцами компонента быть. Аналогично, вес каждой строки связан с наибольшим весом, указанным для компонента в этой строке. Дополнительное пространство имеет тенденцию идти к самому правому столбцу и нижней строке.
вам нужно прочитать далее в учебнике Swing для раздела weightX/weightY
где говорится:
если вы не укажете хотя бы одно ненулевое значение для weightx или weighty, все компоненты сгруппируются в центре своего контейнера.
вы указали weightX, но не weightY.
Edit, это сложнее, чем я думал. Похоже, вам также нужно указать:
constraints.anchor = GridBagConstraints.FIRST_LINE_START;
для обоих компонентов в дополнение к к весомому.
Я, возможно, не отвечаю на ваш вопрос напрямую, но поверьте мне, вы должны сделать свой пробный и erros на макетах с IDE. Я лично предлагаю в NetBeans. Там вы можете перетащить и падение, а затем взглянуть на свойства. Сначала у вас были бы некоторые значения по умолчанию, заданные в инспекторе свойств, и, следовательно, меньше автоматически сгенерированного кода для этого. Но затем, как только вы начнете играть с макетами, вы сможете увидеть код и получить хорошее представление о том, что вы делаете Как поживаете.
вы можете достичь этого, используя трюк, Добавьте фиктивный компонент после строки и разверните его, чтобы заполнить вертикальное пространство. Также вы можете повторно использовать ограничения, не нужно создавать новый объект:
EDIT: ok забудьте трюк : (правильный путь, как сказал Деон бота и Бенколе, я обновил свой код, используя якорь
пожалуйста НЕ примите этот ответ, примите либо Деона, либо Бена
public class MainFrame extends JFrame {
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainFrame frame = new MainFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public MainFrame() {
super();
setBounds(100, 100, 500, 375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container mainContainer = getContentPane();
mainContainer.setLayout(new GridBagLayout());
JLabel someLabel = new JLabel("Label 1:");
JTextField someText = new JTextField(30);
GridBagConstraints constraints = new GridBagConstraints();
constraints.anchor = GridBagConstraints.FIRST_LINE_START;
constraints.gridx = 0;
constraints.gridy = 0;
constraints.weightx = 1.0;
mainContainer.add(someLabel, constraints);
constraints.gridx = 1;
constraints.weightx = 1.0;
constraints.weighty = 1.0;
mainContainer.add(someText, constraints);
}
}
это сработало для меня:
public class NewJFrame extends javax.swing.JFrame {
public NewJFrame() {
initComponents();
}
@SuppressWarnings("unchecked")
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
jPanel2 = new javax.swing.JPanel();
jComboBox3 = new javax.swing.JComboBox();
jComboBox4 = new javax.swing.JComboBox();
jComboBox5 = new javax.swing.JComboBox();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setBackground(new java.awt.Color(255, 204, 51));
setMinimumSize(new java.awt.Dimension(800, 600));
getContentPane().setLayout(null);
jPanel2.setLayout(new java.awt.GridBagLayout());
jComboBox3.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
jPanel2.add(jComboBox3, gridBagConstraints);
jComboBox4.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
jPanel2.add(jComboBox4, gridBagConstraints);
jComboBox5.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
jPanel2.add(jComboBox5, gridBagConstraints);
getContentPane().add(jPanel2);
jPanel2.setBounds(30, 40, 150, 260);
pack();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}
private javax.swing.JComboBox jComboBox3;
private javax.swing.JComboBox jComboBox4;
private javax.swing.JComboBox jComboBox5;
private javax.swing.JPanel jPanel2;
}