Вам необходимо учитывать видимый размер вашего компонента. Это не обязательно будет тот размер, который вы просили.
Вы можете использовать метод getSize
, чтобы определить фактический размер вашего компонента, но вам также нужно вызвать getInsets
, чтобы узнать, было ли зарезервировано какое-либо пространство для использования границами. Это даст вам реальную, пригодную для рисования область:
public void paint(Graphics g) {
Dimension size = getSize();
Insets insets = getInsets();
int available = size.width - insets.left - insets.right;
// Draw stuff. Remember to offset by insets.left and insets.top!
...
}
Также помните, что Graphics
процедуры, такие как fillOval
, опускаются вниз и справа от указанного вами coodinate, поэтому вам нужно подумать о том, что означает координата шара. Это центр мяча, или левая или правая сторона? Возможно, вам придется вычесть ширину шарика при расчете, достиг ли он стороны области рисования или нет.