Ich habe versucht, ein Bildschirmschoner-Programm zu erstellen. Im Wesentlichen gibt es mehrere Kreise, die sich auf dem Bildschirm bewegen. Wenn ich den Hintergrund jedoch transparent mache, kann ich clearErgebnis() nicht mehr verwenden, da der Hintergrund dadurch weiß wird. Gibt es eine Möglichkeit, die bereits gezeichneten Kreise zu löschen, während der Hintergrund transparent bleibt?Java löschen ein JPanel mit einem transparenten Hintergrund
class ScreenSaver extends JPanel implements ActionListener {
static Timer t;
Ball b[];
int size = 5;
ScreenSaver() {
Random rnd = new Random();
b = new Ball[size];
for (int i = 0; i < size; i++) {
int x = rnd.nextInt(1400)+100;
int y = rnd.nextInt(700)+100;
int r = rnd.nextInt(40)+11;
Color c = new Color(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
int dx = rnd.nextInt(20)-10;
if (dx == 0)
dx++;
int dy = rnd.nextInt(20)-10;
if (dy == 0)
dy++;
b[i] = new Ball(x, y, r, c, incR, incG, incB, dx, dy);
}
}
public void actionPerformed(ActionEvent e) {
repaint();
}
public void paintComponent(Graphics g) {
//g.clearRect(0, 0, 1600, 900);
for (int i = 0; i < size; i++) {
if (b[i].x + b[i].r+b[i].dx >= 1600)
b[i].dx *= -1;
if (b[i].x - b[i].r+b[i].dx <= 0)
b[i].dx *= -1;
if (b[i].y + b[i].r+b[i].dy >= 900)
b[i].dy *= -1;
if (b[i].y - b[i].r+b[i].dy <= 0)
b[i].dy *= -1;
b[i].x += b[i].dx;
b[i].y += b[i].dy;
g.fillOval(b[i].x-b[i].r, b[i].y-b[i].r, b[i].r*2, b[i].r*2);
}
}
}
class Painter extends JFrame{
Painter() {
ScreenSaver mySS = new ScreenSaver();
mySS.setBackground(new Color(0, 0, 0, 0)); //setting the JPanel transparent
add(mySS);
ScreenSaver.t = new Timer(100, mySS);
ScreenSaver.t.start();
setTitle("My Screen Saver");
setExtendedState(JFrame.MAXIMIZED_BOTH);
setLocationRelativeTo(null);
setUndecorated(true);
setBackground(new Color(0, 0, 0, 0)); //setting the JFrame transparent
setVisible(true);
}
}
Sie repaint nicht nennen() von einem Farbverfahren, immer werden soll. Es löst einen weiteren Aufruf von paintComponent (eventuell) aus und erzeugt eine Endlosschleife. Rufen Sie paintComponent nicht direkt auf und erstellen Sie keine eigenen Grafiken. Das System macht diese Dinge. Ihre actionPerformed-Methode sollte repaint() und sonst nichts aufrufen. – VGR
@VGR Danke. Machte diese Änderungen und es funktioniert besser. Immer noch nicht die bereits gezeichneten Kreise löschen. – MrE
Was meinen Sie, indem Sie den Hintergrund transparent setzen? Ich habe es in deinen Codes nicht gesehen. – user3437460