Swing не рендерит мои JPanels правильно

1
public void renderPanels(){
    for(int i = 1; i<4; i++){
        for(int j = 1; j<4; j++){
            panels[i][j] = new JPanel();
            frame.add(panels[i][j]);

            buttons[i][j] = new JButton();
            panels[i][j].add(buttons[i][j]);

            panels[i][j].setBounds(i*50, j*50, 50, 50);

            panels[i][j].setLayout(null);

            buttons[i][j].setBounds(0, 0, 50, 50);

            System.out.println(panels[i][j].getBounds());
        }
    }
}

Хорошо, так что это мой код для рендеринга сетки 3х3 с кнопками внутри них. переменная frame содержит объект JFrame но, к сожалению, мой вывод похож на следующий снимок экрана:

Изображение 174551

кадр в последней итерации представляется в месте, как если бы я и j находились на 1 единицу ниже начальных значений. Есть идеи?

  • 0
    Пожалуйста, используйте менеджер макета вместо вызова setBounds .
  • 0
    Что насчет CardLayout?
Показать ещё 4 комментария
Теги:
loops
swing
jpanel
rendering

2 ответа

6
  1. используйте GridLayout вместо setBounds(), не используйте NullLayout вообще

  2. frame.add(panels[i][j]); должна быть последняя строка кода в цикле

  3. System.out.println(panels[i][j].getBounds()); возвращает разумные координаты после JFrame.pack() или JFrame уже visible на экране

  4. для лучшей помощи скорее опубликуйте SSCCE/MCVE, короткий, управляемый, компилируемый

0

Это происходит потому, что макет по умолчанию JFrame не равен null. Это BorderLayout. Если вы действительно хотите установить границы, сделайте макет JFrame null.

frame.setLayout(null);

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

Хотя, GridLayout - это путь. Вот некоторые вещи, которые вам могут потребоваться.

Абсолютное позиционирование

Как использовать GridLayout

Вот некоторые основные из GridLayout

  JPanel m = new JPanel();

        GridLayout gridLayout = new GridLayout(3, 3,0,0);
        m.setLayout( gridLayout);
        for (int i = 0; i < gridLayout.getRows(); i++) {
            for (int ii = 0; ii < gridLayout.getColumns(); ii++) {
                JPanel p = new JPanel();
                p.add(new JButton("X"));
                m.add(p, i, ii);
            }

        }
        frame.add(m);
  • 1
    Извините, я не могу одобрить null макет в этом контексте.
  • 0
    @trashgod он сказал конкретно: «Мой вопрос, почему это не сработает?» в комментарии. Я также знаю, что лучше использовать GridLayout, но я только что дал ответ.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню