Установка размера JButton внутри JPanel с BoxLayout не работает должным образом - PullRequest
2 голосов
/ 04 ноября 2011

Недавно я начал заниматься разработкой пользовательского интерфейса на Java; Раньше я занимался разработкой пользовательского интерфейса в WPF. Некоторые вещи о способе работы Java сбивают с толку.

То, чего я пытаюсь добиться, - это установить минимальный размер кнопки. Вот упрощенный код:

public class MainGameView extends JPanel {  
    public MainGameView(DefaultController controller) {

        this.controller = controller;
        CreateUI();
    }

    private void CreateUI() {
        MenuPanel = new javax.swing.JPanel();
        StartGameBtn = new JButton("Start Game"); 

        // Creating menu
        MenuPanel.setLayout(new BoxLayout(MenuPanel, BoxLayout.Y_AXIS));
        MenuPanel.setPreferredSize(new Dimension(200, 200));

        StartGameBtn.setAlignmentX(Component.LEFT_ALIGNMENT);     
        StartGameBtn.setMinimumSize(new Dimension(200, 30)); 
        MenuPanel.add(StartGameBtn);
    } 
}

Итак, насколько я понимаю, если контейнер получает ширину 200 пикселей, он должен соответственно выделить 200 пикселей ширины для кнопки. Однако кнопка остается того же размера. Я что-то здесь упускаю?

Ответы [ 2 ]

3 голосов
/ 05 ноября 2011

Одна из больших проблем с менеджерами компоновки заключается в том, что все они придерживаются разных правил в отношении того, как они устанавливают размер своих компонентов. Это особенно расстраивает, потому что Swing действительно побуждает вас использовать подход «панели внутри панелей», когда несколько панелей используют разные менеджеры компоновки, встроенные друг в друга.

Например, BoxLayout не растягивает компоненты по горизонтали, а вместо этого придерживается «предпочтительной ширины».

Решение? Вы можете либо продолжать использовать панель с решением для панелей и постоянно бороться с менеджером макетов, либо использовать сторонний менеджер макетов, известный как MigLayout .

MigLayout действительно гибкий, простой в использовании, и я думаю, что он намного лучше, чем любой из стандартных менеджеров свинг-макетов. Кроме того, если вы используете что-то вроде Google WindowBuilder, вы можете использовать MigLayout вместе с перетаскиванием графического редактора и все равно иметь прямой доступ к исходному коду!

2 голосов
/ 04 ноября 2011

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

  MenuPanel.setLayout(new BorderLayout(0,0));
  MenuPanel.setPreferredSize(new Dimension(200, 200));
  StartGameBtn.setAlignmentX(Component.LEFT_ALIGNMENT);     
  MenuPanel.add(StartGameBtn, BorderLayout.NORTH);

Это помещает кнопку вверху, поддерживает ее естественную предпочтительную высоту и растягивает ее горизонтально, чтобы соответствовать ширине панели меню, даже если ее размер был изменен. Вы также можете взглянуть на GridLayout (настроенный с 1 столбцом), который, я считаю, позволит вам добавить несколько компонентов в вертикальный столбец, и все компоненты будут растянуты, чтобы соответствовать всей ширине главной панели.

...