problem mit super.paintComponent(g)
Dies ist der Codeausschnitt :
protected void paintComponent(final Graphics g) {
Runnable r=new Runnable() {
@Override
public void run() {
while(true) {
super.paintComponent(g); //<----- line of error
g.setColor(Color.red);
g.drawOval(x,y,width,height);
g.fillOval(x,y,width,height);
x++;
y++;
width++;
height++;
if(width==20)
break;
try {
Thread.sleep(100);
} catch(Exception exc) {
System.out.println(exc);
}
}
}
};
Thread moveIt=new Thread(r);
moveIt.start();
}
Folgende Fehler wird erzeugt, wenn ich kompilieren der vollständige code :
d:\UnderTest>javac mainClass.java
mainClass.java:18: cannot find symbol
super.paintComponent(g);
^
symbol: method paintComponent(Graphics)
location: class Object
1 error
Warum erhalte ich diese Fehlermeldung?
In diesem Fall ist mein vollständiger code :
import java.awt.*;
import javax.swing.*;
import java.lang.Thread;
class movingObjects extends JPanel {
int x=2,y=2,width=10,height=10;
@Override
protected void paintComponent(final Graphics g) {
Runnable r=new Runnable() {
@Override
public void run() {
while(true) {
super.paintComponent(g);
g.setColor(Color.red);
g.drawOval(x,y,width,height);
g.fillOval(x,y,width,height);
x++;
y++;
width++;
height++;
if(width==20)
break;
try {
Thread.sleep(100);
} catch(Exception exc) {
System.out.println(exc);
}
}
}
};
Thread moveIt=new Thread(r);
moveIt.start();
}
}
class mainClass {
mainClass() {
buildGUI();
}
public void buildGUI() {
JFrame fr=new JFrame("Moving Objects");
movingObjects mO=new movingObjects();
fr.add(mO);
fr.setVisible(true);
fr.setSize(400,400);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String args[]) {
new mainClass();
}
}
- Aufruf von paintComponent aus einem anderen thread ist die schlechte Nachricht, durch die Art und Weise.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie eine Qualifizierte Super.
Weil, wenn Sie
this
odersuper
innerhalb einer inneren Klasse (in diesem Fall:Runnable
), erhalten Sie die innerclass. Wenn Sie möchten, verwenden Sie die äußere Klasse aus der inneren Klasse verwenden Sie eine Qualifizierte Dies oder eine Qualifizierte Super.Qualifiziert Super ist ein Begriff, den ich nicht finden kann in der JLS, die ich erfunden habe.
movingObjects.super.update(g);
es ist definitiv nicht der richtige Weg, dies zu tun. Wenn Sie möchten, um zu lernen, ein richtiger Weg, Sie sollten lernen, mehr über Swing. Die Beobachtung einer Spiel-engine ist sehr interessant. Persönlich mag ich diese von Ivo Wetzel: github.com/BonsaiDen/Bonsai-Game-LibrarymovingObjects.super.update(g);
!Wenn Sie möchten, dass die animation auf ein Swing-panel, dann verwenden Sie eine Swing Timer.
Sollten Sie nicht verwenden Sie eine while (true) - Schleife und der code sollte auf jeden Fall nicht sein, dass ein Teil der paintComponent () - Methode aufrufen oder die paintComponent () - Methode direkt.
In Sie benutzerdefinierte Panels, die Sie brauchen, um Eigenschaften wie setOvalLocation(Punkt). Dann, wenn der Timer feuert, aktualisieren Sie das oval Position und invokd repaint auf dem Bedienfeld.
Ich schlage vor, Sie starten Sie durch das Lesen der Swing-tutorial auf Custom Painting für eine genauere Erklärung und Beispiel.
Weil
Runnable
hat keinepaintComponent()
Methode. Dies ist einer der Nachteile der Verwendung von anonymen inneren Klassen, es macht es schwer zu sehen, was der aktuelle Kontext, aber in deinem Fall ist der Kontext dierun()
Methode, dahersuper
bezieht sich auf die Superklasse Ihre anonyme innere Klasse, dieRunnable
.Wenn Sie möchten, finden Sie die Oberklasse der äußeren Klasse aus einer inneren Klasse, die Sie verwenden sollten
movingObjects.super.paintComponent()
paintComponent()
ist wahrscheinlich nicht die Methode, die Sie überschreiben müssen-im Gegenteil-Sie nicht zu tun haben, diesen thread zu starten business.