Pregunta

Actualmente tengo un pequeño programa Java que me gustaría ejecutar tanto en el escritorio (es decir, en un JFrame) como en un applet. Actualmente, todo el dibujo y la lógica se manejan mediante una clase que extiende el lienzo. Esto me da un método principal muy bueno para la aplicación de escritorio:

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

¿Puedo hacer algo similar para el applet? Lo ideal sería que MyCanvas permaneciera igual en ambos casos.

No estoy seguro de si es importante, pero estoy dibujando usando BufferStrategy con setIgnoreRepaint (true) .

Editar : para aclarar, mi problema parece ser pintar el lienzo, ya que toda la pintura se realiza desde la llamada canvas.loop () .

¿Fue útil?

Solución

Applet es una Contenedor , solo add tu lienzo allí.

Otros consejos

En general, la forma en que tendría una aplicación que también es un applet es que su clase de punto de entrada amplíe Applet, y que su configuración agregue el Canvas a sí mismo, etc. etc.

Luego, en la versión del método principal, simplemente crea una instancia de su clase de Applet y la agrega a un nuevo Marco (o JApplet / JFrame, etc.).

Consulte aquí y here para obtener ejemplos de la técnica, que esencialmente se reduce a (desde el primer ejemplo):

  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 no es apropiado para agregar componentes Swing. Utilice JComponent en su lugar (y setOpaque (true) ).

Los componentes Swing siempre deben manipularse en el Subproceso de Despacho de Eventos AWT (EDT). Use java.awt.EventQueue.invokeLater ( invokeAndWait para los applets). No debes realizar ninguna operación de bloqueo desde la EDT, así que comienza tus propios hilos para eso. De forma predeterminada, se está ejecutando en el subproceso principal (o subproceso de subprograma para applets), que es bastante independiente de la EDT.

Sugiero eliminar cualquier dependencia de MyCanvas a JFrame . También sugiero mantener el código para las aplicaciones que usan marcos separados de los que usan applets. Agregar un componente a un JApplet es lo mismo que para JFrame (en ambos casos hay chanchullos en los que en realidad lo que sucede es que add en realidad llama a < código> getContentPane (). add que puede causar una confusión innecesaria). La principal diferencia es que no puede empacar un applet.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top