while (initialS <= numberS) {
Метод paintComponent () вызывается всякий раз, когда Swing определяет, что компонент необходимо перекрасить.Например, когда вы восстанавливаете фрейм, вызывается метод paintComponent ().
В вашем случае вы не сбрасываете переменную «initialS» в 0, поэтому цикл никогда не будет выполнен во второй раз.Поэтому вам нужно сбросить переменную перед входом в цикл.
save.setBounds(50, 100, 100, 50);
run.setBounds(50, 500, 100, 50);
JPanel panel = new JPanel();
panel.add(save);
panel.add(run);
setBounds (...) ничего не делает.Вы добавляете компоненты в JPanel.По умолчанию JPanel использует FlowLayout.Менеджер по расположению сбросит границы на основе правил менеджера по расположению.
Не пытайтесь устанавливать границы.Пусть менеджер раскладки выполнит свою работу.
Во-вторых, я не могу видеть кнопки, но если указать порядок добавления в обратном порядке,
Макет по умолчаниюМенеджер для JFrame - BorderLayout.Когда вы не указываете ограничение, компонент добавляется в ЦЕНТР.Проблема в том, что вы можете добавить только один компонент в ЦЕНТР, поэтому виден только последний добавленный.
Вместо этого попробуйте:
jFrame.getContentPane().add(canvas, BorderLayout.CENTER);
jFrame.getContentPane().add(panel, BorderLayout.PAGE_START);
, чтобы увидеть оба компонента.
Кроме того, обычно вы бы:
- добавили пользовательский код рисования непосредственно в метод paintComponent () компонента, чтобы сохранить всю логику в одном месте
- переопределить
getPreferredSize()
метод, позволяющий вернуть размер компонента, чтобы менеджеры компоновки могли работать должным образом.
Прочтите раздел из учебника Swing по Custom Painting для получения дополнительной информации и рабочих примеров.