Question

Je dispose actuellement d'un petit programme Java que je souhaiterais exécuter à la fois sur le bureau (c'est-à-dire dans un JFrame) et dans une applet. Actuellement, tous les dessins et la logique sont gérés par une classe qui étend Canvas. Cela me donne une très bonne méthode principale pour l'application Desktop:

public static void main(String[] args) {
    MyCanvas canvas = new MyCanvas();
    JFrame frame = MyCanvas.frameCanvas(canvas);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    canvas.loop();
}

Puis-je faire quelque chose de similaire pour l'applet? Idéalement, MyCanvas resterait le même dans les deux cas.

Je ne sais pas si c'est important, mais je dessine avec BufferStrategy avec setIgnoreRepaint (true) .

Modifier : Pour clarifier, mon problème semble être de peindre la toile - car toute la peinture est réalisée à partir de l'appel canvas.loop () .

Était-ce utile?

La solution

L'applet est un Conteneur , il suffit de ajouter votre toile là-bas.

Autres conseils

En règle générale, une application qui est également une applet consiste à faire en sorte que votre classe de points d'entrée étende l'applet, et que sa configuration ajoute le canevas à lui-même, etc., etc.

Ensuite, dans la version de la méthode principale, il vous suffit d'instancier votre classe Applet et de l'ajouter à un nouveau cadre (ou JApplet / JFrame, etc.).

Voir ici et ici pour des exemples de la technique, qui se résume essentiellement à (à partir du premier exemple):

  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 n’est pas approprié pour l’ajout aux composants Swing. Utilisez plutôt JComponent (et setOpaque (true) ).

Les composants Swing doivent toujours être manipulés sur le thread EDT (AWT Event Dispatch Thread). Utilisez java.awt.EventQueue.invokeLater ( invokeAndWait pour les applets). Vous ne devriez faire aucune opération de blocage à partir de l'EDT, alors lancez vos propres threads pour cela. Par défaut, vous exécutez le fil principal (ou le fil d’applets pour les applets), qui est tout à fait distinct de l’EDT.

Je suggère de supprimer toute dépendance de votre MyCanvas à JFrame . Je suggère également de garder le code pour les applications utilisant un cadre séparé de celui utilisant des applets. Ajouter un composant à un JApplet est identique à celui de JFrame (dans les deux cas, il y a des manigances où réellement, add appelle < code> getContentPane (). add , ce qui peut créer une confusion inutile). La principale différence est que vous ne pouvez pas emballer un applet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top