GridBagLayout в выпуске столбцов Java - PullRequest
3 голосов
/ 27 марта 2011

Я пытаюсь использовать менеджер макета GridBagLayout для достижения этой цели:

enter image description here

Однако в настоящее время я получаю следующее:

enter image description here

Проблема в том, что оранжевые и коричневые / серые панели должны занимать второй столбец, но, похоже, хотят занимать только третий, когда дело доходит до выполнения кода.

код, который я использую для макета:

 Container contentPane = form.getContentPane();
    contentPane.setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();

    JPanel pnlGame = new JPanel();
    pnlGame.setBackground(Color.green); //temp
    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 2;
    c.gridheight = 2;
    c.fill = GridBagConstraints.BOTH;
    c.weightx = 0.85;
    c.weighty = 0.65;
    contentPane.add(pnlGame, c);

    JPanel pnlBuy = new JPanel();
    c.gridx = 2;
    pnlBuy.setBackground(Color.blue); //temp
    c.gridy = 0;
    c.gridwidth = 1;
    c.gridheight = 1;
    c.fill = GridBagConstraints.BOTH;
    c.weightx = 0.15;
    c.weighty = 0.46;
    contentPane.add(pnlBuy, c);

    JPanel pnlUpgrade = new JPanel();
    pnlUpgrade.setBackground(Color.yellow); //temp
    c.gridx = 2;
    c.gridy = 1;
    c.gridwidth = 1;
    c.gridheight = 1;
    c.fill = GridBagConstraints.BOTH;
    c.weightx = 0.15;
    c.weighty = 0.19;
    contentPane.add(pnlUpgrade, c);

    JPanel pnlStats = new JPanel();
    pnlStats.setBackground(Color.red); //temp
    c.gridx = 0;
    c.gridy = 2;
    c.gridwidth = 1;
    c.gridheight = 2;
    c.fill = GridBagConstraints.BOTH;
    c.weightx = 0.61;
    c.weighty = 0.35;
    contentPane.add(pnlStats, c);

    JPanel pnlSpeed = new JPanel();
    pnlSpeed.setBackground(Color.orange); //temp
    c.gridx = 1;
    c.gridy = 2;
    c.gridwidth = 2;
    c.gridheight = 1;
    c.fill = GridBagConstraints.BOTH;
    c.weightx = 0.38;
    c.weighty = 0.04;
    contentPane.add(pnlSpeed, c);

    JPanel pnlRounds = new JPanel();
    pnlRounds.setBackground(Color.gray); //temp
    c.gridx = 2;
    c.gridy = 3;
    c.gridwidth = 2;
    c.gridheight = 1;
    c.fill = GridBagConstraints.BOTH;
    c.weightx = 0.38;
    c.weighty = 0.31;
    contentPane.add(pnlRounds, c);

Итак, что я делаю не так?Извините, если мой английский немного дерьмовый, и / или ошибка, которую я делаю, ослепительно очевидна ... сейчас 20: 5 утра, и у меня был длинный день.Вероятно, должно ударить сено, довольно скоро.

ОБНОВЛЕНИЕ:

Кажется, что если я изменю ширину сетки коричнево-серой панели, все, кажется, выровняется должным образом, но я получаюнеприятный пробел в моем макете.Здесь:

i.imgur.com / 6JUx2.png

и код панели (включая поправку, предложенную Кевином С.):

JPanel pnlRounds = new JPanel();
pnlRounds.setBackground(Color.gray); //temp
c.gridx = 1;
c.gridy = 3;
c.gridwidth = 1;
c.gridheight = 1;
c.fill = GridBagConstraints.BOTH;
c.weightx = 0.38;
c.weighty = 0.31;
contentPane.add(pnlRounds, c);

Итак,Есть ли что-то, что я делаю неправильно, или это просто какое-то странное поведение GridBagLayout, с которым мне придется жить?

К сожалению, благодаря редактированию, я потерял всевставляет, что Бала R любезно положить туда.Итак, мы боимся ссылок на изображения.И теперь кажется, что я не могу опубликовать более двух гиперссылок, поэтому ссылка была убита в последней, вам нужно скопировать и вставить ее.

Спасибо, Сэм

Ответы [ 4 ]

1 голос
/ 27 марта 2011

Все компоненты вашего среднего столбца находятся как минимум в одном другом столбце. Таким образом, GridBagLayout вычисляет предпочтительную ширину среднего столбца как 0, и это эффект, который вы видите.

Если вы хотите убедиться, что ваш средний столбец имеет большую ширину, поместите туда какой-то компонент, который находится только в этом столбце.

0 голосов
/ 27 марта 2011

Вы хотите, чтобы макет работал?

Я внес некоторые изменения.

 Container contentPane = form.getContentPane();
     contentPane.setLayout(new GridBagLayout());
     GridBagConstraints c = new GridBagConstraints();

     JPanel pnlGame = new JPanel();
     pnlGame.setBackground(Color.green); //temp
     c.gridx = 0;
     c.gridy = 0;
     c.gridwidth = 1; // one row
     c.gridheight = 1; // one column
     c.fill = GridBagConstraints.BOTH;
     c.weightx = 0.60;
     c.weighty = 0.40;
     contentPane.add(pnlGame, c);

     // Added two new components
     // pnlgGame and pnlggGame

     // Covers up 2nd column and rows 0 and 1
     JPanel pnlgGame = new JPanel();
     pnlgGame.setBackground(Color.green); //temp
     c.gridx = 1;
     c.gridy = 0;
     c.gridwidth = 1; // one row
     c.gridheight = 2; // two column
     c.fill = GridBagConstraints.BOTH;
     c.weightx = 0.20;
     c.weighty = 0.40;
     contentPane.add(pnlgGame, c);

     // Covers 2nd row and column 1 
     JPanel pnlggGame = new JPanel();
     pnlggGame.setBackground(Color.green); //temp
     c.gridx = 0;
     c.gridy = 1;
     c.gridwidth = 1;
     c.gridheight = 1;
     c.fill = GridBagConstraints.BOTH;
     c.weightx = 0.60;
     c.weighty = 0.20;
     contentPane.add(pnlggGame, c);


     JPanel pnlBuy = new JPanel();
     pnlBuy.setBackground(Color.blue); //temp
     c.gridx = 2;
     c.gridy = 0;
     c.gridwidth = 1;
     c.gridheight = 1;
     c.fill = GridBagConstraints.BOTH;
     c.weightx = 0.20;
     c.weighty = 0.40;
     contentPane.add(pnlBuy, c);

     JPanel pnlUpgrade = new JPanel();
     pnlUpgrade.setBackground(Color.yellow); //temp
     c.gridx = 2;
     c.gridy = 1;
     c.gridwidth = 1;
     c.gridheight = 1;
     c.fill = GridBagConstraints.BOTH;
     c.weightx = 0.20;
     c.weighty = 0.20;
     contentPane.add(pnlUpgrade, c);

     JPanel pnlSpeed = new JPanel();
     pnlSpeed.setBackground(Color.BLUE); //temp
     c.gridx = 1;
     c.gridy = 2;
     c.gridwidth = 2;
     c.gridheight = 1;
     c.fill = GridBagConstraints.BOTH;
     c.weightx = 0.40;
     c.weighty = 0.05;
     contentPane.add(pnlSpeed, c);

     JPanel pnlStats = new JPanel();
     pnlStats.setBackground(Color.red); //temp
     c.gridx = 0;
     c.gridy = 2;
     c.gridwidth = 1;
     c.gridheight = 2;
     c.fill = GridBagConstraints.BOTH;
     c.weightx = 0.60;
     c.weighty = 0.40;
     contentPane.add(pnlStats, c);


     JPanel pnlRounds = new JPanel();
     pnlRounds.setBackground(Color.gray); //temp
     c.gridx = 1;
     c.gridy = 3;
     c.gridwidth = 2;
     c.gridheight = 1;
     c.fill = GridBagConstraints.BOTH;
     c.weightx = 0.40;
     c.weighty = 0.35;
     contentPane.add(pnlRounds, c);

     form.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     form.setVisible(true);
0 голосов
/ 27 марта 2011

Не совсем решение для вас, но больше похоже на временное решение.если вы добавите эту новую панель

    JPanel pnlTemp = new JPanel();
    pnlTemp.setBackground(Color.pink); //temp
    c.gridx = 1;
    c.gridy = 3;
    c.gridwidth = 1;
    c.gridheight = 1;
    c.fill = GridBagConstraints.BOTH;
    c.weightx = 0.38;
    c.weighty = 0.31;
    contentPane.add(pnlTemp, c);

после серой панели, она исправит макет.Не знаю почему, но, возможно, это поможет, пока вы (или кто-то другой) не сможете найти правильное решение.Эта новая розовая панель не видна, а просто помогает как-то исправить макет.Вот как выглядит макет после

enter image description here

0 голосов
/ 27 марта 2011

Похоже, вам нужно исправить pnlRounds JPanel:

JPanel pnlRounds = new JPanel();
pnlRounds.setBackground(Color.gray); //temp
c.gridx = 1; // NEEDS TO BE 1 (NOT 2)
c.gridy = 3;
c.gridwidth = 2;
c.gridheight = 1;
c.fill = GridBagConstraints.BOTH;
c.weightx = 0.38;
c.weighty = 0.31;
contentPane.add(pnlRounds, c);

Похоже, ваша проблема в том, что в вашем коде было c.gridx = 2, когда c.gridx = 1 - то, что действительно должно быть там.

Кроме того, как примечание, весовые показатели нижних панелей не увеличиваются до 1,00, а добавляются к 0,99.Просто думал, что вы должны знать.

...