Непонятный GridBagLayout. Кнопки и размеры. Правильная компановка GridBagLayout

237
18 октября 2017, 05:05

Создаю текстовую игру. Проблема в окне с самими действиями в игре. Хочется, что бы окно выглядело так: Для этого я решил использовать GridBagLayout, но его работа мне не понятна, потому что при использовании следующего кода:

Класс GamePanel

public class GamePanel extends JPanel {
    JTextArea txtGameLog;
    NavigatePanel navigatePanel;
    InfoPanel infoPanel;
    public GamePanel() {
        setBackground(new Color(200, 120, 90));
        txtGameLog = new JTextArea();
        navigatePanel = new NavigatePanel();
        infoPanel = new InfoPanel();
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.weightx = 1;
        gbc.weighty = 0.1;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 2;
        gbc.anchor = GridBagConstraints.PAGE_START;
        add(txtGameLog, gbc);
        gbc.weighty = 0.25;
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 1;
        gbc.anchor = GridBagConstraints.LAST_LINE_START;
        add(infoPanel, gbc);
        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.gridwidth = 1;
        gbc.anchor = GridBagConstraints.LAST_LINE_END;
        add(navigatePanel, gbc);
    }
}
class NavigatePanel extends JPanel {
    GameButton btnNorth;
    GameButton btnSouth;
    GameButton btnWest;
    GameButton btnEast;
    public NavigatePanel() {
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        setBackground(Color.GRAY);
        btnNorth = new GameButton(Localization.getString("ui.game.btnNorth"));
        btnSouth = new GameButton(Localization.getString("ui.game.btnSouth"));
        btnWest = new GameButton(Localization.getString("ui.game.btnWest"));
        btnEast = new GameButton(Localization.getString("ui.game.btnEast"));
        gbc.fill = GridBagConstraints.NONE;
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.anchor = GridBagConstraints.PAGE_END;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 2;
        add(btnNorth, gbc);
        gbc.anchor = GridBagConstraints.LINE_END;
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 1;
        add(btnWest, gbc);
        gbc.anchor = GridBagConstraints.LINE_START;
        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.gridwidth = 1;
        add(btnEast, gbc);
        gbc.anchor = GridBagConstraints.PAGE_START;
        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.gridwidth = 2;
        add(btnSouth, gbc);
    }
}

Класс InfoPanel

class InfoPanel extends JPanel {
    JLabel lblGrenade;
    JLabel lblTreasure;
    GameButton btnMenu;
    public InfoPanel() {
        setBackground(Color.LIGHT_GRAY);
        btnMenu = new GameButton(Localization.getString("ui.game.btnMenu"));
        add(btnMenu, BorderLayout.CENTER);
    }
}

Класс GameButton

public class GameButton extends JButton{
    public GameButton(String name){
        super(name);
        setBackground(new Color(190, 170, 155));
        setMinimumSize(new Dimension(60, 60));
        setMaximumSize(new Dimension(60, 60));
        setSize(60, 60);
        setAlignmentX(CENTER_ALIGNMENT);
    }
}

Получается следующее: Это почти, то, что я хочу. Но пропорции размещения панелей и расстояния между кнопками неправильное. Как сгруппировать кнопки как на первой картинке и как правильно задать пропорции? Как работает gbc.weightx и gbc.weighty?

и немного оффтоп: здесь есть сворачиваемый спойлер?

Answer 1

Я бы сделала так (GamePanel):

    GridBagConstraints gbc = new GridBagConstraints();
    gbc.fill = GridBagConstraints.BOTH;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.gridwidth = 2;
    gbc.anchor = GridBagConstraints.CENTER;
    add(txtGameLog, gbc);
    gbc.weighty = 0;
    gbc.weightx = 1;
    gbc.gridx = 0;
    gbc.gridy = 1;
    gbc.gridwidth = 1;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.anchor = GridBagConstraints.LAST_LINE_START;
    add(infoPanel, gbc);
    gbc.weighty = 0;
    gbc.weightx = 0;
    gbc.gridx = 1;
    gbc.gridy = 1;
    gbc.gridwidth = 1;
    gbc.fill = GridBagConstraints.NONE;
    gbc.anchor = GridBagConstraints.LAST_LINE_END;
    add(navigatePanel, gbc);
READ ALSO
Крутить ScrollView на всех item ах recycleView

Крутить ScrollView на всех item ах recycleView

В каждом итеме recycleView есть горизонтальный ScrollViewКак можно сделать так, чтобы при скролле ScrollView одного из итемов крутились и другие ScrollView на других...

199
Как использовать класс одного проекта в другом проекте в Intellij Idea

Как использовать класс одного проекта в другом проекте в Intellij Idea

Те существует два каталога со своими пакетами>классами, как мне добавить в проект 1 - классы из проекта 2

426
Neither BindingResult nor plain target object for bean name 'book' available as request attribute

Neither BindingResult nor plain target object for bean name 'book' available as request attribute

Стартовая страницаВ настройках tomcat http://localhost:8080/index

576
Как спарсить текст с картинки? [требует правки]

Как спарсить текст с картинки? [требует правки]

Есть 1000 картинок 2-х типов: 1) с чёрным текстом и белым фоном 2) инверсия первой(с белым текстом и чёрным фоном)

301