#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