Java GridBagLayout с компонентами внутри - PullRequest
1 голос
/ 15 января 2012

Я пытаюсь получить GridBagLayout с двумя панелями, чтобы он составлял 40% и 60% от фрейма, при этом в нем могут быть компоненты, и это создает проблемы.

Когда я не размещаю кнопкувнутри панели он работает так, как я хочу.

Не совсем уверен, что я делаю неправильно, и я попытался переместить создание кнопки туда, где создается панель на GridBagLayout, но все равноне работал

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Test{

public void display(){
    JFrame frame = new JFrame();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(900,650);
    frame.setVisible(true);

    JPanel test = new JPanel();
    test.setLayout(new GridBagLayout());
    GridBagConstraints c= new GridBagConstraints();

    JPanel left= new JPanel();
    JPanel right= new JPanel();

    c.fill = GridBagConstraints.VERTICAL - GridBagConstraints.HORIZONTAL;
    c.weightx = 0.4;
    c.gridx = 1;
    c.weighty = 1;
    test.add(left,c);
    c.weightx = .6;
    c.gridx = 2;
    test.add(right,c);

    JButton button= new JButton("A button");
    left.add(button,c);//If I do not add this, then it shows how I want it to be

    frame.add(test);
   }
}

Ответы [ 2 ]

1 голос
/ 15 января 2012

Что касается весов, они описывают, что делать с дополнительным пространством.Компоненты имеют свои предпочтительные, минимальные и максимальные размеры, которые менеджер компоновки использует при расчете макета.Затем GridBagLayout разделяет дополнительное пространство, используя эти веса.В вашем случае я думаю, что пространство, которое разделено, равно 900-button.getPreferredSize (). Width.Возможно, вы разделяете 800 пикселей на 320 и 480.

0 голосов
/ 15 января 2012

Вот пример панели, созданной с помощью GridBagLayout: (не беспокойтесь о фабрике свинга, просто создайте компонент вместо этого)

private void buildSourcePanel() {

  JPanel pnlSource = new JPanel();

  GridBagLayout gbl_pnlSource = new GridBagLayout();
  gbl_pnlSource.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0};
  gbl_pnlSource.columnWidths = new int[]{0, 0, 100, 100, 25};
  pnlSource.setLayout(gbl_pnlSource);

  final JLabel lblFolderMask = swingFactory.createLabel(" SOURCE DIRECTORY ", null, null, SwingConstants.LEFT, SwingConstants.CENTER, true);
  pnlSource.add(lblFolderMask, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, 10, 1, new Insets(5, 5, 5, 0), 0, 0));

  txtSource = swingFactory.createTextField(null, "txtSource", null, SystemColor.textHighlight, SwingConstants.LEFT, false, true, "Source Directory");
  pnlSource.add(txtSource, new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0, 10, 1, new Insets(5, 0, 5, 5), 0, 0));

  final JButton btnBrowse = new JButton("Browse...");
  btnBrowse.setBorder(new CompoundBorder(new LineBorder(new Color(0, 0, 0), 0, false), new EmptyBorder(5, 5, 5, 5)));
  btnBrowse.setFont(new Font("Verdana", Font.BOLD, 14));
  pnlSource.add(btnBrowse, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, 10, 1, new Insets(5, 0, 5, 5), 0, 0));

  final JButton btnClear = new JButton("Clear...");
  btnClear.setBorder(new CompoundBorder(new LineBorder(new Color(0, 0, 0), 0, false), new EmptyBorder(5, 5, 5, 5)));
  btnClear.setFont(new Font("Verdana", Font.BOLD, 14));
  pnlSource.add(btnClear, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0, 10, 1, new Insets(5, 0, 5, 5), 0, 0));

  lblStatus = swingFactory.createLabel(null, null, null, SwingConstants.CENTER, SwingConstants.CENTER, false);
  pnlSource.add(lblStatus, new GridBagConstraints(4, 0, 1, 1, 0.0, 0.0, 10, 1, new Insets(5, 5, 5, 5), 0, 0));
}
...