Вы не можете рисовать прямо поверх JFrame. Для «нестандартной окраски» (как это называется) вам необходимо создать подкласс компонента, который переопределяет метод paintComponent
. Например, JPanel:
class RectanglePanel extends JPanel {
int numberOfRectangles = 2;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
Random random = new Random(42);
for (int i = 0; i < numberOfRectangles; i++) {
x = random.nextInt(540);
y = random.nextInt(290);
g.drawRect(x, y, 60, 10);
}
}
}
Вы используете этот пользовательский компонент так же, как и JPanel:
rectanglePanel = new RectanglePanel();
rectanglePanel.setPreferredSize(new Dimension(600, 300));
add(rectanglePanel, BorderLayout.CENTER);
Чтобы нарисовать меньше или больше прямоугольников, самое простое, что вы можете сделать это изменить numberOfRectangles
настраиваемого компонента, а затем попросить его перерисовать себя.
int numberOfRectangles = RectangleSlider.getValue();
rectanglePanel.numberOfRectangles = numberOfRectangles;
rectanglePanel.repaint();
Обратите внимание, что это упрощенная демонстрация и не демонстрирует «хорошие практики», такие как инкапсуляция. Более продвинутый метод заключается в использовании шаблона модель-представление-контроллер и создании объекта «модель», который инкапсулирует то, что предполагается рисовать. Вы можете узнать больше о том, как это работает, например здесь: Паттерн MVC и Swing