Функция Java для создания панели GUI

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

GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints bc = new GridBagConstraints();
this.setLayout(gridbag);

bc.fill = GridBagConstraints.HORIZONTAL;
bc.anchor = GridBagConstraints.WEST;
bc.insets = new Insets(0, 10, 10, 0);
bc.gridx = 0;
bc.gridy = 0;
bc.gridwidth = 1;
this.add(programNameLabel, bc);

так что его можно написать, вызывая такую ​​функцию:

labelPosition(GridBagConstraints.HORIZONTAL, GridBagConstraints.WEST, 0, 10, 10, 0, 0, 0, 1, programNameLabel);

Вот функция, которую я написал для этой задачи.

protected void labelPosition(int axis, int direction, int insetOne, int insetTwo, int insetThree, int insetFour, int gridX, int gridY, int gridWidth, JLabel name)
    {
        GridBagLayout gridbag = new GridBagLayout();
        GridBagConstraints bc = new GridBagConstraints();
        this.setLayout(gridbag);

        bc.fill = axis;
        bc.anchor = direction;
        bc.insets = new Insets(insetOne, insetTwo, insetThree, insetFour);
        bc.gridx = gridX;
        bc.gridy = gridY;
        bc.gridwidth = gridWidth;
        this.add(name, bc);
    }

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

Возможно ли то, что я пытаюсь сделать, или мне что-то не хватает в моем коде? Какие-либо предложения?


person tworley1977    schedule 30.06.2016    source источник


Ответы (1)


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

protected void addComponent(int axis, int direction, int insetOne, int insetTwo, int insetThree, int insetFour, 
                            int gridX, int gridY, int gridWidth, JComponent component) {

    GridBagConstraints bc = new GridBagConstraints();

    bc.fill = axis;
    bc.anchor = direction;
    bc.insets = new Insets(insetOne, insetTwo, insetThree, insetFour);
    bc.gridx = gridX;
    bc.gridy = gridY;
    bc.gridwidth = gridWidth;

    this.add(component, bc);
}

...
GridBagLayout gridbag = new GridBagLayout();
this.setLayout(gridbag);

addComponent(GridBagConstraints.HORIZONTAL, GridBagConstraints.WEST, 0, 10, 10, 0, 0, 0, 1, new JLabel("Hello"));
addComponent(GridBagConstraints.HORIZONTAL, GridBagConstraints.WEST, 0, 10, 10, 0, 0, 1, 1, new JButton("World"));
...

Кстати, если это новый проект, вы можете рассмотреть возможность просмотра JavaFX вместо Swing.

person Andreas Fester    schedule 30.06.2016
comment
Понятно. Я оставляю вызов GridBagLayout () в функции, в которой я вызываю свою функцию labelPosition (), и перемещаю только вызов Constraints () в новую функцию. Я рад, что все получилось. В результате из этого файла было выброшено около 100 строк кода, что сделало его более читаемым. Спасибо за Андреаса. - person tworley1977; 30.06.2016