Male eine Leinwand in einem Applet
Frage
Im Moment habe ich ein kleines Java-Programm, das Ich mag würde sowohl auf dem Desktop (dh in einem JFrame) und in einem Applet ausführen zu können. Derzeit werden alle der Zeichnung und Logik sind durch eine Klasse erweitert Leinwand behandelt. Das gibt mir ein sehr schönes Hauptmethode für die Desktop-Anwendung:
public static void main(String[] args) {
MyCanvas canvas = new MyCanvas();
JFrame frame = MyCanvas.frameCanvas(canvas);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.loop();
}
Kann ich etwas ähnliches für das Applet? Idealer MyCanvas würde die für beide Fälle gleich bleiben.
Nicht sicher, ob es ist wichtig, aber ich bin Zeichnung mit BufferStrategy mit setIgnoreRepaint(true)
.
Bearbeiten :. Um zu klären, mein Problem scheint die Leinwand zu malen - da alle Gemälde aus dem canvas.loop()
Aufruf gemacht werden
Lösung
Applet ist ein Container , nur hinzufügen Ihre Leinwand gibt.
Andere Tipps
Im Allgemeinen ist die Art und Weisen Sie eine Anwendung haben würden, die auch ein Applet ist Ihr Eintrittspunkt Klasse hat Applet erstrecken und deren Einrichtung die Leinwand selbst hinzufügen etc. etc.
Dann wird in der Haupt-Methode Version, die Sie gerade Ihre Applet-Klasse instanziiert und fügen Sie ihn in einem neuen Frame (oder JApplet / JFrame, etc.).
Siehe hier und hier Beispiele für die Technik, die (von dem ersten Beispiel) im wesentlichen darauf:
public static void main(String args[])
{
Applet applet = new AppletApplication();
Frame frame = new Frame();
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
frame.add(applet);
frame.setSize(IDEAL_WIDTH,IDEAL_HEIGHT);
frame.show();
}
Canvas
ist ungeeignet für das Hinzufügen von Komponenten Swing. Verwenden JComponent
statt (und setOpaque(true)
).
Swing-Komponenten sollten immer auf dem AWT Event Dispatch Thread (EDT) manipuliert werden. Verwenden Sie java.awt.EventQueue.invokeLater
(invokeAndWait
für Applets). Sie sollten alle blockierenden Operationen aus dem EDT nicht tun, also Ihre eigenen Threads dafür starten. Standardmäßig Sie laufen im Hauptthread (oder Applet-Thread für Applets), die aus dem EDT ganz getrennt ist.
Ich schlage vor, um jegliche Abhängigkeit von Ihrem MyCanvas
zu JFrame
. Ich schlage vor, auch Code für Anwendungen getrennt zu halten mit Rahmen aus, dass die Verwendung Applets. Hinzufügen einer Komponente zu einem JApplet
ist die gleiche wie für JFrame
(in beiden Fällen ist es Blödsinn, wo eigentlich das, was passiert ist, dass add
getContentPane().add
tatsächlich aufruft, die einige unnötige Verwirrung verursachen kann). Der wesentliche Unterschied ist, dass Sie nicht ein Applet pack
können.