Pintura uma tela em um applet
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()
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.