2015-09-22 5 views
1

У меня есть GridBagLayout, который находится внутри JPanel, но находится в центре мертвого посередине.Reposition whole GridBagLayout

The whole area is a JPanel

По существу, что им пытаются сделать, это сохранить Компоновка то же самое, но он переехал туда, где красная стрелка указывает (или даже чуть ниже). Вот некоторые из кода, который я написал:

setLayout(new GridBagLayout()); 

...make all the JLabels/RadioBtns.. 

GridBagConstraints gbc1 = new GridBagConstraints(); 
gbc1.anchor=GridBagConstraints.FIRST_LINE_START; 
gbc1.insets = new Insets(5,5,5,5); 

gbc1.gridy=0; 
gbc1.gridx=0; 
add(title, gbc1); 

gbc1.gridx=0; 
gbc1.gridy=1; 
add(block, gbc1); 

..add more components 
+0

'GridBagLayout' по умолчанию, будет центрировать все компоненты вокруг середины контейнера. Вы можете использовать 'weightx' и' weighty' для изменения того, как какой-либо данный компонент заполняет свою ячейку с оставшимся пространством в контейнере, и используя простой «пустой» компонент наполнителя, расположенный справа/ниже других компонентов, даст желаемый эффект. «JLabel» без текста может хорошо работать здесь – MadProgrammer

ответ

7

Эта проблема почти всегда вызывается не устанавливая свойства 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(); 
      } 
     }); 
    } 
} 
+0

Спасибо. Я пробовал это раньше. Он выравнивает макет в верхнем правом углу, но он также рассеивает компоненты на панели. Я хочу сохранить ту же кластеризацию. Я хочу, чтобы все метки и радиообъективы были рядом (например, на рис.) – OrangePot

+1

@OrangePot: ах, тогда вам нужно * вложить * JPanels для достижения этого. См. Править для ответа. –

+1

@OrangePot: например, см. Код, добавленный в edit. –