Java GridLayout размещает все мои JPanels в верхнем левом углу

#java #swing #user-interface #awt #grid-layout

#java #swing #пользовательский интерфейс #awt #сетка-макет

Вопрос:

РЕШАЕМАЯ:

Только что выяснил, в чем проблема, после попытки создать SSCCE.

Это было связано с моим классом cell, я не понимал, что переопределяю getX() и getY() из класса JComponent.

После переименования этих средств доступа все работает так, как ожидалось

========================================

У меня есть JPanel с GridLayout, установленным в 3 строки x 3 столбца.

Я пытаюсь добавить JPanels в каждую ячейку в gridlayout, чтобы заполнить все 9 ячеек. Каждая из этих JPanels имеет переопределенный метод paintChildren, который будет рисовать некоторый прямоугольник, начинающийся в верхнем левом углу JPanel — конечным результатом будет то, что в каждой ячейке есть прямоугольник, начинающийся в верхнем левом углу ячейки.

После добавления всех JPanels в gridlayout все они отображаются в верхнем левом углу, перекрывая друг друга (я подтвердил, что они перекрываются), вместо того, чтобы располагаться в сетке 3×3.

Как я могу расположить их в сетке 3×3?

(Упрощенный) код:

 public class Panel extends JPanel {

public Panel(int x, int y) {
    layout = new GridLayout(x, y, 2, 2);
    setLayout(layout);

    populateGrid();
}

public void populateGrid() {

    removeAll();

    for (int i = 0; i < 9; i  )
        add(new Cell(50,50));
}
}

public class Cell extends JPanel {

public Cell(int x, int y) {
    // x/y values used to define rectangle
    setBorder(BorderFactory.createLineBorder(new Color(0,0,0)));
    setBackground(Color.WHITE);

}

public void paintChildren(Graphics g) {
    g.setColor(Color.BLUE);
    g.fillRect(0, 0, x, y);
}
}
  

Комментарии:

1. «(Упрощенный) код:» Для более быстрой помощи публикуйте SSCCE , а не некомпилируемые фрагменты кода.

2. Взгляните на эти заметки . Они поставляются с примерами, а также охватывают макет панели и т. Д.

Ответ №1:

  • Убедитесь, что вы импортируете правильно Panel . (А не java.awt.Panel класс.) Или, лучше, переименуйте свой класс в GridPanel или что-то подобное, чтобы избежать путаницы / столкновений.

  • Вы, вероятно, не хотите переопределять paintChildren . Переопределение paintComponent звучит как лучший вариант в этом случае.

  • Возможно, вы захотите установить минимальный / предпочтительный / максимальный размер для Cell класса.

Сложно сделать больше наблюдений без фактического кода, который создает и использует ваш Panel класс.

Комментарии:

1. Да — я переименовал их для публикации здесь, фактическое название более значимо. Я создаю экземпляр панели с помощью: new Panel(3, 3); , и он помещается в центр borderlayout