Вот проблема:
super.paintComponent(g);
ShapeDrawerGui SdG = new ShapeDrawerGui((Graphics2D)this.getGraphics());
g
и SdG
- это два разных объекта, и нелогично, g
, принадлежащий вашей специализированной панели, НЕ тот, который всегда рисует на ней.
В зависимости от того, что делает ваша программа, они могут ОБА использоваться для рисования на холст, однако g
всегда будет отрисовываться последним и сохраняться после завершения рисования SgD
. даже если Graphics2D
, который вы получили SgD
ДОЛЖЕН принадлежать компоненту, в который вы хотите рисовать, (getGraphics()
), это не означает, что для рисования холста используется Графика.
Я знаю, что это нелогично. У каждого jJXXX есть связанный объект Graphics, который используется для рисования, но это не значит, что он будет использоваться Swing для рисования, несмотря ни на что.
Графика, поступающая к вам через параметр в paintComponent, НЕ является той же графикой, что вы получаете из getGraphics()
, даже если paintComponent()
- это метод для того же объекта, на котором вы вызываете getGraphics.
Если вы хотите увидеть это, просто установите логическое значение для первой строки этого оператора в paintComponent(Graphics g)
:
boolean sameObject = (g== getGraphics())
и распечатайте sameObject
. Вы увидите слово false
.
Так что оба используются для рисования на экране. Вы видите это, потому что в это время ваш холст g
делает рисунок. Затем, через микросекунду, g
, который вы получаете в качестве параметра, рисует, и он рисует в последнюю очередь.
Тот, кто рисует последние, побеждает. Это своего рода обратное противостояние.