Лучший Swing Layout для 2-мерной сетки кнопок? - PullRequest
3 голосов
/ 20 апреля 2011

Я пытаюсь создать JDialog, например, диалоговое окно Symbol в Microsoft Word, которое вы выбираете, выбрав Symbol ... в меню Insert .По сути, это n x m ( n и m неизвестны до времени выполнения) сетки маленьких кнопок.У меня есть первая версия, которая работает хорошо, используя GridLayout.Проблема в том, что когда вы изменяете размер диалогового окна (и есть требование, что вы должны иметь возможность изменять его размер), размер кнопок изменяется.Мне нужно, чтобы размер кнопок оставался постоянным.

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

Я подумал о нескольких способах исправить это:

  1. Когда размер диалогового окна изменяется, создайте новый GridLayout и снова заполняйте его кнопками.Я собираюсь попробовать это и посмотреть, как это выглядит, но это выглядит как неуклюжий способ сделать это.
  2. Используйте другой тип макета, такой как FlowLayout.Я сделал удар, но все кнопки n x m в одном ряду.Я не хочу использовать горизонтальные полосы прокрутки и кнопки убегали от правого края.В любом случае, это должна быть двумерная сетка кнопок.

Как лучше всего решить эту проблему с макетом?

Ответы [ 4 ]

4 голосов
/ 20 апреля 2011

Создайте панель кнопок с помощью GridLayout и установите для нее фиксированный размер (можно рассчитать во время выполнения). Панель кнопок должна содержаться в панели BoxLayout.

Ознакомьтесь с BoxLayout Tutorial

Очень Очень базовый пример:

public static void main(String[] args) throws Exception
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel buttonPanel = new JPanel();
        JPanel containerPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(2,2));
        buttonPanel.add(new JButton("1"));
        buttonPanel.add(new JButton("2"));
        buttonPanel.add(new JButton("3"));
        buttonPanel.add(new JButton("4"));
        buttonPanel.setPreferredSize(new Dimension(300, 400));
        containerPanel.add(buttonPanel);

        frame.getContentPane().add(containerPanel);
        frame.pack();
        frame.setVisible(true);
    }
2 голосов
/ 20 апреля 2011

если диалог расширяется, но остается на той же высоте, количество строк должно уменьшаться, а количество столбцов - увеличиваться.

Wrap Layout может быть то, что вы ищете.

2 голосов
/ 20 апреля 2011

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

2 голосов
/ 20 апреля 2011

У меня была похожая проблема с одним столбцом кнопок, и я обнаружил, что MiGLayout (стороннее, доступно здесь ) было простым и эффективным для этого. Это помогало как в создании сетки, так и в настройке размеров кнопок, хотя мне потребовался день или два, чтобы привыкнуть к ее синтаксису.

Но ключ действительно устанавливает размеры кнопок; GridLayout определенно похоже на путь к макету, который, ну, в общем, сетка. Я не тестировал, но подозреваю, что встроенные setXSize() методы будут работать так же хорошо. Учебное пособие GridBagLayout содержит примеры некоторых вещей, которые вы можете сделать с изменением размера / позиционированием.

...