Pergunta

Actualmente tenho um pequeno programa em Java que gostaria de executar tanto no ambiente de trabalho (ou seja, em um JFrame) e em um applet. Atualmente todo o desenho e lógica são manipulados por uma classe estendendo Canvas. Isso me dá um método main muito bom para a aplicação Ambiente de Trabalho:

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

Posso fazer algo semelhante para o applet? Idealmente MyCanvas permaneceria o mesmo para ambos os casos.

Não tenho certeza se é importante, mas estou desenho usando BufferStrategy com setIgnoreRepaint(true).

Editar :. Para esclarecer, o meu problema parece estar pintando a tela - uma vez que toda a pintura está sendo feito a partir da chamada canvas.loop()

Foi útil?

Solução

Applet é um Container , apenas add sua lona lá.

Outras dicas

Geralmente, a maneira que você tiver um aplicativo que também é um applet é ter sua classe de ponto de entrada estender Applet, e tem a sua configuração adicionar a tela para si, etc. etc.

Em seguida, na versão principal método, você só instanciar a classe Applet e adicioná-lo a um novo quadro (ou JApplet / JFrame, etc.).

aqui e aqui para exemplos da técnica, que essencialmente se resume a (a partir do primeiro exemplo):

  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 é inadequada para a adição de componentes Swing. Use JComponent vez (e setOpaque(true)).

componentes Swing deve sempre ser manipulado no thread AWT Despacho do evento (EDT). Use java.awt.EventQueue.invokeLater (invokeAndWait para applets). Você não deve fazer qualquer operação de bloqueio do EDT, assim que começar suas próprias threads para isso. Por padrão, você está executando no thread principal (ou applet de thread para applets), que é bastante separado da EDT.

Sugiro remover qualquer dependência do seu MyCanvas para JFrame. Eu também sugiro manter o código para aplicações usando quadro separar do que o uso de applets. Adicionando um componente a um JApplet é o mesmo que para JFrame (em ambos os casos há travessuras, onde na verdade o que acontece é que add realmente chama getContentPane().add que pode causar alguma confusão desnecessária). A principal diferença é que você não pode pack um applet.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top