2017-01-26 9 views
-1

Я реализован JPanel использование GridBagLayout следующим образом:GridBag не отображает все компоненты в строке

fileSelectionDetails = new JPanel(); 
fileSelectionGridBagLayout = new GridBagLayout(); 
fileSelectionDetails.setLayout(fileSelectionGridBagLayout); 


JLabel lblFile1 = new JLabel("File 1:"); 
JTextField txtFile1Path = new JTextField();  
JButton btnBrowseFile1 = new JButton("Browse..."); 

addComponentToFileSelectionGrid(lblFile1, 0, 0, 1, 1, 20, 100, GridBagConstraints.NONE, GridBagConstraints.WEST); 
addComponentToFileSelectionGrid(txtFile1Path, 1, 0, 3, 1, 60, 100, GridBagConstraints.HORIZONTAL, GridBagConstraints.WEST); 
addComponentToFileSelectionGrid(btnBrowseFile1, 2, 0, 1, 1, 20, 100, GridBagConstraints.HORIZONTAL, GridBagConstraints.WEST); 

private void addComponentToFileSelectionGrid(Component component, int gridX, int gridY, 
          int gridWidth, int gridHeight, int weightX, 
          int weightY, int fill, int anchor) { 

    GridBagConstraints constraint = new GridBagConstraints(); 
    constraint.gridx = gridX; 
    constraint.gridy = gridY; 
    constraint.gridwidth = gridWidth; 
    constraint.gridheight = gridHeight; 
    constraint.weightx = weightX; 
    constraint.weighty = weightY;  
    constraint.fill = fill; 
    constraint.anchor = anchor; 
    fileSelectionGridBagLayout.setConstraints(component, constraint); 
    fileSelectionDetails.add(component); 
} 

Я хочу, чтобы мои компоненты раскладываются следующим образом:

enter image description here

Однако , что я на самом деле вижу:

enter image description here

т. Е. Отсутствует кнопка «Обзор ...»! Почему это?

+1

Кто знает. Возможно, кадр недостаточно велик, чтобы отображать все компоненты. Отправьте правильный [mcve], который демонстрирует проблему. – camickr

+0

Просто понял, что это связано с тем, что свойство 'gridx' ограничения моей кнопки равно 2, но текстовое поле охватывает 3 ячейки сетки, закрывая кнопку. – petehallw

+0

Интересно, я не думал, что значение 'gridWidth' имело значение, когда у вас был только один ряд компонентов. Чтобы увеличить текстовое поле, просто используйте: 'new JTextField (20)' при создании текстового поля. Он рассчитает размер для хранения 20 символов «W». – camickr

ответ

2

С вашего рисунка, я предполагаю, что вы не хотите относительной ширины вообще. Похоже, вы хотите, чтобы метка и кнопка были их предпочтительными размерами, и JTextField, чтобы растянуть, чтобы занять по всей ширине не используемой меткой и кнопкой.

Как предложили camickr, вы должны дать JTextField содержательного предпочтительного размера инициализации его с числом столбцов, как new JTextField(20).

Затем вы можете воспользоваться некоторыми полезными аспектами GridBagLayout и GridBagConstraints:

  • Значение по умолчанию gridx и gridy RELATIVE, что означает, что каждый добавленный компонент помещается справа от последнего добавленного. Это просто то, что вы хотите. Поэтому вы не должны устанавливать gridx или gridy вообще.
  • Значение по умолчанию для gridwidth и gridheight равно 1. Это то, что вы хотите. Ячейки GridBagLayout являются гибкими, поэтому настройка ширины сетки одного компонента на 3 составляет , а не, что делает его в три раза шире, чем у компонента, ширина сетки которого равна 1. Ширина ячейки или диапазон ячеек полностью зависит от того, что она содержит.
  • Когда вы добавляете компонент в GridBagLayout, объект GridBagConstraints клонируется внутри GridBagLayout. Это означает, что вы можете повторно использовать один и тот же объект GridBagConstraints снова и снова, изменяя только те поля, которые необходимо изменить.

С этим знанием, ваш код может быть упрощен:

fileSelectionDetails = new JPanel(new GridBagLayout()); 

JLabel lblFile1 = new JLabel("File 1:"); 
JTextField txtFile1Path = new JTextField(20); 
JButton btnBrowseFile1 = new JButton("Browse\u2026"); 

txtFile1Path.setMinimumSize(txtFile1Path.getPreferredSize()); 

GridBagConstraints constraints = new GridBagConstraints(); 
constraints.fill = GridBagConstraints.HORIZONTAL; 

constraints.weight = 0; 
fileSelectionDetails.add(lblFile1, constraints); 
constraints.weight = 1; 
fileSelectionDetails.add(txtFile1Path, constraints); 
constraints.weight = 0; 
fileSelectionDetails.add(btnBrowseFile1, constraints); 
+0

Это очень хорошее представление, и вы правы - я хочу, чтобы текстовое поле заполнило оставшуюся ширину. Спасибо за ваши предложения! – petehallw

1

Вы определяете gridWidth = 3 для txtFile1Path, но добавляете btnBrowseFile1 в gridX = 2. Вы должны установить addComponentToFileSelectionGrid (btnBrowseFile1, 4 ... и т. Д.

+0

(1+), да, в противном случае кнопка и текстовое поле окрашены в том же месте, что легче увидеть, если логика изменена на 'new JTextField (20)'. Вы увидите, что текстовое поле нарисовано поверх кнопки. – camickr

+0

Я уже упоминал об этом, но спасибо. – petehallw

Смежные вопросы