Problema com applet

5 respostas
F
Ola, eu estou a estudar um applet tirado de um livro:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.AudioClip;

public class sapo extends JApplet implements ActionListener, KeyListener {

        Timer relogio;
        Image imgFundo, imgSapo, imgNave;
        int xSapo, ySapo;
        int xNave, yNave;
        static String fichFundo = "fundo.jpg";
        static String fichSapo = "sapo.gif";
        static String fichNave = "rocketship.gif";
        static String fichSom = "plop.wav";
        Panel p;
        String mensagem;
        int tempoMensagem;
        Font fonteMsg;
        AudioClip som;
        PainelAnimacao meuPainel;

        public void init() {
                //Lê as imagens
                imgFundo = getImage(getCodeBase(), fichFundo);
                imgSapo = getImage(getCodeBase(), fichSapo);
                imgNave = getImage(getCodeBase(), fichNave);
                //Lê som
                som = getAudioClip(getCodeBase(), fichSom);

                p = new Panel(new GridLayout ( 1, 1 ));
                getContentPane().add(p);
                xSapo = 320;
                ySapo = 420;
                xNave = -25;
                yNave = 50;
                enableEvents(AWTEvent.KEY_EVENT_MASK);
                p.addKeyListener(this);
                tempoMensagem = 0;
                fonteMsg = new Font("Serif",Font.BOLD, 24);
                mensagem = "";

                buildUI(getContentPane());

                int atraso = 100;               // em milissegundos
                relogio = new Timer ( atraso, this );
                relogio.setInitialDelay ( 0 );
                relogio.setCoalesce ( true );
                if (!relogio.isRunning()) {
                        relogio.start();
                }
        }

        void buildUI(Container container) {
                meuPainel = new PainelAnimacao();
                container.add(meuPainel, BorderLayout.CENTER);
        }

        public void keyTyped ( KeyEvent e ) {
        }

        public void keyPressed ( KeyEvent e ) {
                e.consume( );
                switch(e.getKeyCode( )){
                        case KeyEvent.VK_LEFT :
                                xSapo -= 5;
                                break;
                        case KeyEvent.VK_RIGHT :
                                xSapo += 5;
                                break;
                        case KeyEvent.VK_DOWN :
                                ySapo += 5;
                                break;
                        case KeyEvent.VK_UP :
                                ySapo -= 5;
                                break;
                }
                repaint( );
        }

        public void keyReleased ( KeyEvent e ) {
        }

        public void actionPerformed(ActionEvent e)
        {
                xNave += 5;
                if ( xNave > 650 ) xNave = -25;

                // Verifica se o sapo está sobreposto à nave
                int largNave = imgNave.getWidth (this);
                int altNave = imgNave.getHeight (this);
                int largSapo = imgSapo.getWidth (this);
                int altSapo = imgSapo.getHeight (this);
                Rectangle rSapo = new Rectangle ( xSapo, ySapo, largSapo, altSapo );
                Rectangle rNave = new Rectangle ( xNave, yNave, largNave, altNave );

                // Testa se algum canto do sapo está dentro da nave e vice-versa
                if ( rNave.contains ( xSapo, ySapo ) ||
                        rNave.contains ( xSapo + largSapo, ySapo ) ||
                        rNave.contains ( xSapo, ySapo + altSapo ) ||
                        rNave.contains ( xSapo + largSapo, ySapo + altSapo ) ||
                        rSapo.contains ( xNave, yNave ) ||
                        rSapo.contains ( xNave + largNave, yNave ) ||
                        rSapo.contains ( xNave, yNave + altNave ) ||
                        rSapo.contains ( xNave + largNave, yNave + altNave )
                        ) {
                        mensagem = "Acertei!!";
                        som.play();
                        // O sapo encontrou a nave, logo coloca a nave num ponto aleatório
                        xNave = -25;
                        yNave = (int)((imgFundo.getHeight(this) - imgSapo.getHeight(this)) *
                                Math.random());
                        tempoMensagem = 0;
                } else
                        // Não apaga a mensagem durante 10 disparos do relógio
                        if ( ++tempoMensagem > 10 )
                                mensagem = "";

                repaint ( );
        }

        class PainelAnimacao extends JPanel {

                //Desenha o painel da animação
                public void paintComponent(Graphics g) {
                        super.paintComponent(g);

                        g.drawImage(imgFundo, 0, 0, this);
                        g.drawImage(imgNave, xNave, yNave, this);
                        g.drawImage(imgSapo, xSapo, ySapo, this);

                        g.setFont(fonteMsg);
                        g.drawString ( mensagem, 200, 30 );

                        p.requestFocus ( );
                }
        }
}

E eu abro o applet e aparece-me um quadrado cinzento e mais nada. Eu suponho que o problema esteja aqui:

public void init() {
                //Lê as imagens
                imgFundo = getImage(getCodeBase(), fichFundo);
                imgSapo = getImage(getCodeBase(), fichSapo);
                imgNave = getImage(getCodeBase(), fichNave);

O método getCodeBase() returns um URL. Não percebo muito bem isso mas porque é que para obter uma imagem se haveria de precisar de um URL?
Não se pode simplesmente dizer o path para a imagem? Por exemplo C:\fundo e pronto?

Segundo esta pagina, "Class URL represents a Uniform Resource Locator, a pointer to a "resource" on the World Wide Web. A resource can be something as simple as a file or a directory" , por tanto, podia um URL ser C:\fundo ?

Alguém sabe como me ajudar?

Obrigado

5 Respostas

F

alguêm?

E

Applets normalmente não devem acessar arquivos locais da máquina do usuário (já que estáo rodando em browsers). Para fazerem isso, devem ser assinadas digitalmente, o que dificulta sua utilização.

Lindberg

Arquivo.bat - com os dados abaixo:

del impressodir.jar
@pause Apagou o Jar para Criar novamente o JAR
jar cvf impressodir.jar impressodir.class

@pause Criar a assinatura
keytool -genkey -dname “cn=impressodir, ou=Lindberg, o=Empresa, c=BR” -alias Impralias -storepass 111222 -validity 3655

@pause Assinar o jar
jarsigner -storepass 111222 impressodir.jar Impralias

ver se ajuda

Lindberg

um exemplo:

impressodir.java
import javax.swing.JApplet;
import javax.swing.SwingUtilities;
import javax.swing.JLabel;

import java.io.*;

public class impressodir extends JApplet {
    public void init() {
                    try {
//-------------------- imprimir direto na porta LPT1 ------------------------
                        PrintWriter pw = new PrintWriter(new FileOutputStream("LPT1"));    //---- ou "//nome_do_computador/impressora_rede"
                        pw.println("Impressao teste, ================ OLA SOU UM APPLET!");
                        pw.close();
                    } catch (Exception p) {
                        p.printStackTrace();
                    }
    }
}
F

mas um URL não pode ser um path para um ficheiro no nosso computador?

Criado 17 de agosto de 2011
Ultima resposta 18 de ago. de 2011
Respostas 5
Participantes 3