É possível passar parâmetros para a "public void actionPerformed (ActionEvent e)"? [RESOLVIDO]

5 respostas
H

Estou desenvolvendo uma aplicação cliente/servidor e estou tendo alguns problemas com o servidor. Preciso fazer com que se tenha um tipo de ação para cada requisição do cliente. Por exemplo, se o cliente dá play no vídeo, a sequencia de imagens é mostrada de um jeito. Se dá FF, é mostrada de outro (acelerado).

Eu estou tentando fazer isso passando parâmetros para uma classe anônima interna, a "public void actionPerformed (ActionEvent e)" (trecho que está comentado), mas não consigo. O programa faz tudo certinho, só não executa o que está dentro da "actionPerformed" quando tento passar algum parâmetro. Qual é o problema? Alguém tem alguma idéia de como posso fazer isso?

Pode parecer complexo, mas a pergunta é de iniciante mesmo.

Valeu aí por qualquer ajuda.

O código do meu servidor está aí:

public class AplicacaoServidor extends JFrame implements ActionListener
{
    ...
    final static int INIT = 0;
    final static int READY = 1;
    final static int PLAYING = 2;
    final static int SETUP = 3;
    final static int PLAY = 4;
    final static int PAUSE = 5;
    final static int TEARDOWN = 6;
	final static int FF = 7;
	final static int RW = 8;
	final static int FF2 = 9;
    ...

	public AplicacaoServidor()
	{
		super("Aplicacao Servidor"); 
		timer = new Timer(PERIODO_QUADRO, this);
		timer.setInitialDelay(0);
		timer.setCoalesce(true);
		timer2 = new Timer(PERIODO_QUADRO2, this);
		timer2.setInitialDelay(0);
		timer2.setCoalesce(true);
		timer3 = new Timer(PERIODO_QUADRO3, this);
		timer3.setInitialDelay(0);
		timer3.setCoalesce(true);
		buf = new byte[15000];
        b = new byte [15000];
		addWindowListener(new WindowAdapter()
        {
            @Override
            public void windowClosing(WindowEvent e)
            {
                timer.stop();
                System.exit(0);
            }
        });
		label = new JLabel("Enviando quadro #        ", JLabel.CENTER);
		getContentPane().add(label, BorderLayout.CENTER);
	}
    public static void main(String argv[]) throws Exception
    {
...

   }
    private void enviaVideo()
	{
        if (controle < COMP_VIDEO)
		{
			controle++;
            imagem = controle;
            //int casa = traduz_resp_RTSP();
            //if (casa==PLAY){imagem=controle;}
            //else if (casa==FF){imagem=2*controle;}
            //else if (casa==FF2){imagem=4*controle;}
            //else if (casa==RW && controle>30){controle=controle-30};
            //else {controle=1};
            try
			{
                int tam_imagem = video.getTam(imagem);
                byte[] frame = video.getImagem(imagem);
                EmpacotaRTP pacote_rtp = new EmpacotaRTP(CARGA_UTIL, imagem, imagem*PERIODO_QUADRO, frame, tam_imagem);
                int tam_pacote = pacote_rtp.gettamanho();
				byte[] bitstream = new byte[tam_pacote];
				pacote_rtp.getpacote(bitstream);
				enviapacoteudp = new DatagramPacket(bitstream, tam_pacote, ClientIPAddr, RTP_porta_destino);
				RTPsocket.send(enviapacoteudp);
				System.out.println("Enviando frame #"+imagem);
				pacote_rtp.mostracabecalho();
				label.setText("Enviando frame #" + imagem);
			}
			catch(Exception ex)
		    {
				System.out.println("Exception caught: "+ex);
				System.exit(0);
		    }
	    }
		else
	    {
			timer.stop();
	    }
    }
    public void actionPerformed(ActionEvent e)
	{
        enviaVideo();
    }

...	
}

5 Respostas

ViniGodoy

Onde vc chama o método actionPerformed?

H

Oi!

Entre as linhas 224 e 227.

Eu tinha feito uma classe enviaVideo separada pra que ela fosse chamada pelo ActionPerformed já numa tentativa de passar os parâmetros que preciso.
Antes, ela estava assim e já não estava dando pra passar parâmetros pra ela (trecho comentado é o que faz dar pau no programa):

public void actionPerformed(ActionEvent e) 
	{
        if (controle < COMP_VIDEO)
		{
			controle++;
            imagem = controle;
            //if (e.getSource()=botaoPlay){System.out.println("play");}
            //int casa = teste;
            //if (casa==PLAY){imagem=controle;}
            //else if (casa==FF){imagem=2*controle;}
            //else if (casa==FF2){imagem=4*controle;}
            //else if (casa==RW && controle>30){controle=controle-30};
            //else {controle=1};
            try
			{
                int tam_imagem = video.getTam(imagem);
                byte[] frame = video.getImagem(imagem);

                EmpacotaRTP pacote_rtp = new EmpacotaRTP(CARGA_UTIL, imagem, imagem*PERIODO_QUADRO, frame, tam_imagem);

                int tam_pacote = pacote_rtp.gettamanho();
				byte[] bitstream = new byte[tam_pacote];
				pacote_rtp.getpacote(bitstream);
				enviapacoteudp = new DatagramPacket(bitstream, tam_pacote, ClientIPAddr, RTP_porta_destino);
				RTPsocket.send(enviapacoteudp);
				System.out.println("Enviando frame #"+imagem);
				pacote_rtp.mostracabecalho();
				label.setText("Enviando frame #" + imagem);
			}
			catch(Exception ex)
		    {
				System.out.println("Exception caught: "+ex);
				System.exit(0);
		    }
	    }
		else
	    {
			timer.stop();
	    }
    }
ViniGodoy

Você deveria usar == e não só = nesse if:
if (e.getSource()==botaoPlay){System.out.println(“play”);}

H

Você tem razão! Realmente faltou colocar um “=”.
Mesmo assim, não funcionou desse jeito. É que os botões de controle ficam no programa cliente e eu precisava dar um jeito de identificar qual comando tinha sido dado pelo cliente, mas no servidor.

Consegui indo por um outro caminho.
A "public void actioPerformed (ActionEvent e) é uma classe anônima interna e, por isso, só tem acesso às variáveis finais, não é isso?
O problema, então, passou a ser como modificar uma variável final.

Pra fazer isso e usá-la para passar os parâmetros que eu tava precisando pra fazer as comparações (se o comando for play, faça …), criei um arraylist de inteiros, final como tinha que ser, e pra cada ação do cliente, eu inseri um número no arraylist, correspondente a cada opção (play, pause…). Daí, dentro da classe anônima interna, pedi pra ler qual era o valor da última posição do array. Pronto! Consegui fazer as comparações!

Daqui a pouquinho eu coloco aqui os trechos do programa. Volto já!

H

Olha só como eu fiz o if:

if (controle < COMP_VIDEO)
		{
			controle++;
            int index = lista.size();
            int cont = lista.get(index-1);
               
            if (cont==PLAY) {imagem = controle;}
            else if (cont==FF) {imagem=2*controle;}
            else if (cont==FF2) {imagem=4*controle;}
            else if (cont==RW)
            {
                if(controle>30){controle=controle-30;}
                else {controle=1;}
                imagem = controle;
                lista.add(PLAY);
            }
            else {imagem = controle;}

E a variável que criei, como tinha falado, taí.

final static ArrayList<Integer> lista = new ArrayList<Integer>();

Lembrando que Play, Pause... eram variáveis finais já.

final static int SETUP = 3;
    final static int PLAY = 4;
    final static int PAUSE = 5;
    final static int TEARDOWN = 6;
    final static int FF = 7;
    final static int RW = 8;
    final static int FF2 = 9;

Valeu!

Criado 10 de agosto de 2009
Ultima resposta 12 de ago. de 2009
Respostas 5
Participantes 2