Эта проблема почти всегда вызывается не устанавливая свойства GridBagConstraints.weightx и GridBagConstraints.weighty правильно. Их значение по умолчанию равно 0, что говорит о том, что компоненты группируются в центре с размером около предпочтительного размера. Дайте им как 1.0 для всех компонентов, так и посмотрите, что происходит.
GridBagConstraints gbc1 = new GridBagConstraints();
gbc1.anchor=GridBagConstraints.FIRST_LINE_START;
gbc1.insets = new Insets(5,5,5,5);
// ***** add: *****
gbc1.weightx = 1.0;
gbc1.weighty = 1.0;
Это говорит о том, что макет должен расширяться как по направлениям x, так и по оси y, если ячейка сетки имеет пространство для расширения.
Если это не поможет, то вы захотите создать и опубликовать Minimal, Complete, and Verifiable example.
Еще одна вещь: часто лучший самый приятный макет достигается, если вы позволяете все компоненты стремиться к достижению их PreferredSize, и лучше всего это делать, избегая вызова setSize(...)
или setPreferredSize(...)
на большинстве компонентов, а просто вызвать pack()
на вершине перед его отображением.
Редактировать
В комментарии вы состояние:
Я попытался это раньше. Он выравнивает макет в верхнем правом углу, но он также рассеивает компоненты на панели. Я хочу сохранить ту же кластеризацию. Я хочу, чтобы все этикетки и radiobtns быть рядом (как в картинке)
Тогда то, что вы хотите сделать, это использовать и гнездо, по крайней мере два JPanels, первое использование GridBagLayout и проведение элементы графического интерфейса, как показанный выше, и второй, удерживающий первый GridBagLayout-использование JPanel. Этот второй JPanel может использовать BoxLayout или FlowLayout (FlowLayout.LEFT), или множество других возможных макетов или комбинаций макетов.
Например:
import java.awt.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class GridBagLayoutEg extends JPanel {
private static final Insets INSETS = new Insets(5, 5, 5, 5);
private static final int PREF_W = 800;
private static final int PREF_H = 600;
public GridBagLayoutEg() {
JPanel innerPanel = new JPanel(new GridBagLayout());
innerPanel.add(new JLabel("Sequence name: abcdc"), createGbc(0, 0));
GridBagConstraints gbc = createGbc(1, 0);
gbc.gridwidth = 3;
innerPanel.add(new JLabel(), gbc);
innerPanel.add(new JLabel("Block making alighment tool:", SwingConstants.LEFT), createGbc(0, 1));
innerPanel.add(new JRadioButton("Mafft"), createGbc(1, 1));
innerPanel.add(new JRadioButton("Muscle"), createGbc(2, 1));
innerPanel.add(new JRadioButton("ClusteIO"), createGbc(3, 1));
innerPanel.add(new JLabel("Select Codon Table:", SwingConstants.LEFT), createGbc(0, 2));
innerPanel.add(new JRadioButton("Standard"), createGbc(1, 2));
innerPanel.add(new JRadioButton("Custom"), createGbc(2, 2));
innerPanel.add(new JLabel(), createGbc(3, 2));
innerPanel.add(new JLabel("Strictness:", SwingConstants.LEFT), createGbc(0, 3));
innerPanel.add(new JTextField(2), createGbc(1, 3));
innerPanel.add(new JLabel("Degeneracy:", SwingConstants.LEFT), createGbc(0, 4));
innerPanel.add(new JTextField(2), createGbc(1, 4));
setLayout(new FlowLayout(FlowLayout.LEADING, 0, 0));
add(innerPanel);
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
private GridBagConstraints createGbc(int x, int y) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = x;
gbc.gridy = y;
gbc.insets = INSETS;
gbc.fill = GridBagConstraints.HORIZONTAL;
return gbc;
}
private static void createAndShowGui() {
JFrame frame = new JFrame("GridBagLayoutEg");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new GridBagLayoutEg());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
'GridBagLayout' по умолчанию, будет центрировать все компоненты вокруг середины контейнера. Вы можете использовать 'weightx' и' weighty' для изменения того, как какой-либо данный компонент заполняет свою ячейку с оставшимся пространством в контейнере, и используя простой «пустой» компонент наполнителя, расположенный справа/ниже других компонентов, даст желаемый эффект. «JLabel» без текста может хорошо работать здесь – MadProgrammer