Hallo,
ich habe eine Aufgabe, in welcher ein einfaches Programm geschrieben werden soll, welches aus einem JFrame und einem JPanel besteht. Auf dem JPanel soll eine Ente gezeichnet werden. Die Position der Ente wird 50 mal zufällig ermittelt und im Abstand von einer Sekunde soll diese dann neu gezeichnet werden.
Das Programm ist denkbar einfach und auch kein Problem. Allerdings habe ich eine Lösung zu dieser Aufgabe erhalten, welche einen Fehler enthält, den ich nicht nachvollziehen kann. Hier mal der Quellcode des JFrames:
und hier das JPanel:
Anstatt das die Ente nun 50 mal innerhalb der Fenstergröße neu gezeichnet wird, wird das komplette JPanel an anderen Stellen gezeichnet, was man anhand der Border sehen kann. Ich hatte gedacht, dass das an der setX() und der setY() Methode liegt, da diese evtl. bestehende Methoden überschreiben. Allerdings sind diese Methoden in der API zum JPanel nicht dokumentiert. Warum verschiebt sich also nun das JPanel im JFrame?
p.s.: die ente.gif ist im Anhang
Gruß
htz
ich habe eine Aufgabe, in welcher ein einfaches Programm geschrieben werden soll, welches aus einem JFrame und einem JPanel besteht. Auf dem JPanel soll eine Ente gezeichnet werden. Die Position der Ente wird 50 mal zufällig ermittelt und im Abstand von einer Sekunde soll diese dann neu gezeichnet werden.
Das Programm ist denkbar einfach und auch kein Problem. Allerdings habe ich eine Lösung zu dieser Aufgabe erhalten, welche einen Fehler enthält, den ich nicht nachvollziehen kann. Hier mal der Quellcode des JFrames:
Java:
public class Fenster {
public static void main(String[] args) {
JFrame f =new JFrame ("Beste Ente ");
f.setSize(800,600);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
PaintIcon p = new PaintIcon();
try {
BufferedImage image = ImageIO.read(new File("ente.gif"));
f.add(p);
p.setBild(image);
p.setBorder(new LineBorder(Color.black));
} catch (IOException e) {
e.printStackTrace();
}
Random a = new Random();
for (int i = 0; i < 50; i++) {
System.out.println("Breite"+p.getWidth());
System.out.println("Hoehe"+p.getHeight());
// int x = a.nextInt(p.getWidth()-80);
// int y = a.nextInt(p.getHeight()-60);
int x = a.nextInt(800-80);
int y = a.nextInt(600-60);
System.out.println("X: "+x+", Y: "+y);
p.setX(x);
p.setY(y);
f.repaint();
try{
Thread.sleep(1000);
}catch(InterruptedException e){
}
}
}
}
und hier das JPanel:
Java:
public class PaintIcon extends JPanel {
int x = 0, y = 0;
public int getX() {
return x;
}
public void setX(int a) {
this.x = a;
}
public int getY() {
return y;
}
public void setY(int b) {
this.y = b;
}
private BufferedImage bild;
public void setBild(BufferedImage bild) {
this.bild = bild;
//repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponents(g);
g.drawImage(bild, x, y, 80, 60, this);
}
}
Anstatt das die Ente nun 50 mal innerhalb der Fenstergröße neu gezeichnet wird, wird das komplette JPanel an anderen Stellen gezeichnet, was man anhand der Border sehen kann. Ich hatte gedacht, dass das an der setX() und der setY() Methode liegt, da diese evtl. bestehende Methoden überschreiben. Allerdings sind diese Methoden in der API zum JPanel nicht dokumentiert. Warum verschiebt sich also nun das JPanel im JFrame?
p.s.: die ente.gif ist im Anhang
Gruß
htz
Anhänge
Zuletzt bearbeitet: