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 () .

È stato utile?

Soluzione

Applet è un Container , solo aggiungi la tua tela lì.

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 impacchettare un'applet.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top