Dipingere una tela in un'applet
Domanda
Al momento ho un piccolo programma Java che vorrei eseguire sia sul desktop (cioè in un JFrame) che in un'applet. Attualmente tutto il disegno e la logica sono gestiti da una classe che estende Canvas. Questo mi dà un metodo principale molto carino per l'applicazione desktop:
public static void main(String[] args) {
MyCanvas canvas = new MyCanvas();
JFrame frame = MyCanvas.frameCanvas(canvas);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.loop();
}
Posso fare qualcosa di simile per l'applet? Idealmente MyCanvas rimarrebbe lo stesso per entrambi i casi.
Non sono sicuro che sia importante, ma sto disegnando usando BufferStrategy con setIgnoreRepaint (true)
.
Modifica : per chiarire, il mio problema sembra dipingere la tela - dal momento che tutto il dipinto viene eseguito dalla chiamata canvas.loop ()
.
Altri suggerimenti
Generalmente, il modo in cui avresti un'applicazione che è anche un'applet è far estendere la tua classe del punto di ingresso e far sì che la sua configurazione aggiunga il Canvas a se stesso, ecc. ecc.
Quindi, nella versione del metodo principale, è sufficiente creare un'istanza della classe Applet e aggiungerla a un nuovo Frame (o JApplet / JFrame, ecc.).
Vedi qui e qui per esempi della tecnica, che si riduce essenzialmente a (dal primo esempio):
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
non è appropriato per l'aggiunta ai componenti Swing. Utilizzare invece JComponent
(e setOpaque (true)
).
I componenti swing devono sempre essere manipolati sul thread di invio eventi AWT (EDT). Utilizzare java.awt.EventQueue.invokeLater
( invokeAndWait
per le applet). Non dovresti fare alcuna operazione di blocco dall'EDT, quindi avvia i tuoi thread per quello. Per impostazione predefinita, stai eseguendo il thread principale (o thread dell'applet per applet), che è abbastanza separato dall'EDT.
Suggerisco di rimuovere qualsiasi dipendenza da MyCanvas
a JFrame
. Suggerisco anche di mantenere il codice per le applicazioni che utilizzano frame separato da quello che utilizza applet. L'aggiunta di un componente a un JApplet
è la stessa di JFrame
(in entrambi i casi ci sono shenanigans dove in realtà ciò che accade è che add
chiama effettivamente < code> getContentPane (). add che può causare confusione non necessaria). La differenza principale è che non puoi