Então... você está sobrescrevendo o método paint do JFrame, certo?
Pq, se for de um JPanel, você deveria estar sobrescrevendo paintComponent.
Quanto ao fundo transparente. Se você sobrescreveu o método de pintura, você deverá pintar o fundo na mão, ou fazer uma chamada a super.paint() logo no inicio do seu método.
Pode ser mais ou menos assim (assumindo que é o paint do frame):
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D)g.create();
//Abaixo, criamos um retângulo em toda a tela, com a cor do fundo
g2d.clearRect(0, 0, this.width(), this.height());
//Aqui você coloca o resto do seu código de pintura
g2d.dispose();
}
Ou:
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D)g.create();
//Chamamos o paint do frame, para que ele se encarregue do fundo
//Isso também pintará componentes sobre o frame, caso existam
super.paint(g);
//Aqui você coloca o resto do seu código de pintura
g2d.dispose();
}
Se você vai pintar várias vezes, fazendo uma animação, então o ideal é nem sequer usar o método paint. Se você fizer isso, se deparará com uma tela piscando, um efeito conhecido como flicking. Se for esse o seu caso, dê uma lida neste tópico.
Cara, se não for muito grande, põe a tua aplicação num zip e anexa aqui pra gente dar uma olhada...