GridBagLayout добавляет дополнительное пространство в столбец - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть JPanel с GridBagLayout в качестве менеджера по расположению, и я пытаюсь получить это расположение:

https://i.stack.imgur.com/ZZmVH.png

Игнорироватьдополнительное темно-синее пространство границы.

У меня есть в общей сложности 5 столбцов и 3 строки, и для всех компонентов setPreferredSize() установлено на точное значение, чтобы идеально поместиться в JPanel, который также имеет предпочтительный размер(170 x 115).

Проблема заключается в том, что GridBagLayout, по-видимому, добавляет 30 пикселов к ширине последнего столбца, поскольку только добавление 30 пикселов к ширине JPanel (всего 200)компоненты отображаются правильно, например:

https://i.stack.imgur.com/GzjDz.png

, но последний столбец отделен из-за дополнительного пробела.

Добавляется 30pxls, потому что добавление 29 pxls к ширине JPanel дает такой результат:

https://i.stack.imgur.com/tdmYI.png

, который, по моему опыту, говорит о том, что доступное пространство слишком мало, чтобы показать все компонентыа затем использует setMinimumSize().

Я не знаю, откуда взялись эти 30 пикселей, пожалуйстаМожет кто-нибудь сказать мне, как сделать компоненты подходят?

Код показан ниже и в настоящее время дает этот результат:

https://i.stack.imgur.com/p77am.png

Игнорироватьдополнительное черное пространство JFrame.

Вы можете изменить ширину JPanel в строке 34.

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

public class Test{
    public static void main (String[] args){
        JFrame f;
        SizeProperties p;

        f = new JFrame();
        p = new SizeProperties();

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().setPreferredSize(new Dimension(250,200));
        f.getContentPane().setBackground(Color.BLACK);
        f.setLayout(new FlowLayout());

        f.add(p);
        f.pack();
        f.setVisible(true);
    }
}

final class SizeProperties extends JPanel{
    private GridBagConstraints c;
    private PropertiesLabel xL,yL,wL,hL;
    private PropertiesField xF,yF,wF,hF;
    private ProportionToggleButton ptb;

    SizeProperties(){
        setBackground(new Color(18,101,142));
        setPreferredSize(new Dimension(170,115));//Change width here
        setLayout(new GridBagLayout());

        xL = new PropertiesLabel("x:",25,25);
        xF = new PropertiesField();
        yL = new PropertiesLabel("y:",25,25);
        yF = new PropertiesField();
        wL = new PropertiesLabel("Width:",80,25);
        wF = new PropertiesField();
        hL = new PropertiesLabel("Height:",80,25);
        hF = new PropertiesField();
        ptb = new ProportionToggleButton();

        c = new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,0),0,0);
        add(xL,c);

        c = new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,0,10,10),0,0);
        add(xF,c);

        c = new GridBagConstraints(2,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,0,10,0),0,0);
        add(yL,c);

        c = new GridBagConstraints(3,0,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,0,10,10),0,0);
        add(yF,c);

        c = new GridBagConstraints(0,1,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,10,10,0),0,0);
        add(wL,c);

        c = new GridBagConstraints(2,1,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,10,10),0,0);
        add(wF,c);

        c = new GridBagConstraints(0,2,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,10,10,0),0,0);
        add(hL,c);

        c = new GridBagConstraints(2,2,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,10,10),0,0);
        add(hF,c);

        c = new GridBagConstraints(4,1,1,2,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,10,10),0,0);
        add(ptb,c);

    }
}

final class PropertiesLabel extends JLabel{
    PropertiesLabel(String label,int w,int h){
        setText(label);
        setPreferredSize(new Dimension(w,h));
        setBackground(Color.BLACK);
        setOpaque(true);
        setForeground(Color.WHITE);
        setFont(new Font("SansSerif",Font.PLAIN,14));
        setHorizontalAlignment(SwingConstants.CENTER);
        setVerticalAlignment(SwingConstants.CENTER);
    }
}

final class PropertiesField extends JTextField{
    private int validNumber = 0;

    PropertiesField(){
        setPreferredSize(new Dimension(45,25));
        setBackground(new Color(202,226,255));
        setForeground(Color.BLACK);
        setFont(new Font("SansSerif",Font.PLAIN,14));
        setHorizontalAlignment(JTextField.CENTER);
        setText("999");
    }
}

final class ProportionToggleButton extends JToggleButton{
    ProportionToggleButton(){
        setPreferredSize(new Dimension(15,60));
    }
}

Заранее спасибо.

1 Ответ

0 голосов
/ 27 февраля 2019

У меня всего 5 столбцов

Не из того, что я вижу.Вы не можете просто назначить компонент столбцу.На самом деле вам нужно иметь 5 компонентов в одной строке, чтобы создать сетку из 5 столбцов.

Исходя из вашего изображения, у вас в первом ряду 4 столбца, а в последних двух рядах 3 столбца.

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

  1. у вас есть три столбца на основе последних двух строк.
  2. теперь в первой строке x / 999 будет одной панелью с двумя компонентами.Эта панель будет в 1-м столбце (с метками ширины / высоты).
  3. Также в первом ряду y / 999 будет одной панелью с двумя компонентами и будет начинаться во 2-м столбце и иметьgridwidth 2. 2. 1016 *
  4. 2-й и 3-й ряд будет содержать компонент 999 во втором столбце
  5. кнопка запускается во 2-м ряду и имеет высоту сетки 2 и будет содержаться в 3-мколонка

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

...