Swing: JPanel "setSize" игнорируется? - PullRequest
0 голосов
/ 26 марта 2020

Таким образом, в моей программе buttonPanel.setSize, похоже, не работает:

public class View extends JFrame {

private JButton[] button = new JButton[16];
private JPanel buttonPanel;

public View() {
    super();
    init();
}

public void init() {
    setTitle("Memory-Game");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(750, 500);
    setResizable(false);
    setLocationRelativeTo(null);
    getContentPane().setLayout(new BorderLayout());

    buttonPanel = new JPanel(new GridLayout(4, 4, 5, 5));
    for (int x = 0; x < 16; x++) {
        button[x] = new JButton();
        buttonPanel.add(button[x]);
    }
    buttonPanel.setSize(315, 315);
    getContentPane().add(buttonPanel, BorderLayout.CENTER);

    setVisible(true);
}

public static void main(String[] args) {
    new View();
}

Хотя размер JFrame равен 750x500, я хочу, чтобы buttonPanel занимал только пространство 315x315 в центре. Однако buttonPanel растягивается по всему JFrame.

buttonPanel.setSize(315, 315);

Как это исправить?

1 Ответ

2 голосов
/ 26 марта 2020

Однако панель кнопок растягивается по всему JFrame.

Правильно. Это правило BorderLayout. Любой компонент, добавленный в CENTER, займет все пространство, доступное в кадре.

И GridLayout также увеличится, чтобы занять все доступное пространство.

Я хочу, чтобы buttonPanel только Занимайте пространство 315x315 в центре.

Не пытайтесь указывать размеры в пикселях. Это не тот способ, которым работает управление компоновкой.

Самый простой способ центрировать компонент в кадре - это использовать GridBagLayout:

//getContentPane().setLayout(new BorderLayout()); // remove
...
//getContentPane().add(buttonPanel, BorderLayout.CENTER); // remove
setLayout( new GridBagLayout() );
add(buttonPanel, new GridBagConstraints());

Теперь каждая кнопка будет установлена ​​на свою предпочтительный размер и размер панели будет содержать все кнопки.

Если вам нужно дополнительное пространство для кнопок, используйте свойство, например:

button[x].setMargin( new Insets(20, 20, 20, 20) );

Прочитайте учебник Swing на Менеджеры макетов для получения дополнительной информации о каждом менеджере макетов и рабочих примерах.

Редактировать:

для JFrame задан определенный размер c, размер которого не изменяется. , Есть ли способ сделать это с пикселями независимо от

Забудьте о кадре. Это не то, как вы используете Swing. Размер компонентов может быть разным на каждом LAF. Например, используемый шрифт может быть другим. Размер строки заголовка или границы рамки может быть разным. Не пытайтесь установить размер кадра. Вы даете «подсказки» для каждого компонента и позволяете каждому компоненту определять его размер. Тогда вы pack() рамка и рамка станет размером дочерних компонентов.

Так, например, для кнопок, которые вы можете сделать:

button.setPreferredSize( new Dimension(50, 50) );

Так, если у вас есть 4 кнопки в сетке, размер панели будет (200 x 200).

Если вам нужно дополнительное пространство на панели, вы можете сделать:

panel.setBorder( new EmptyBorder(200, 200, 200, 200) );

, который зарезервирует дополнительное пространство под размер панели, включая кнопки, которые теперь становятся (400 x 400).

Тогда при pack() размере кадра размер кадра будет (600 x 600) плюс размер строки заголовка и границ.

Прочтите руководство! Также есть раздел на How to Use Borders.

...