Ir para o conteúdo

 Voltar a Linguagem NCL
Tela cheia

Dúvidas NCL

19 de Setembro de 2007, 17:32 , por Desconhecido - | Ninguém seguindo este artigo por enquanto.
Visualizado 23 vezes

Olá pessoal,

Estou começando a me interagir com a linguagem NCL agora e, durante os estudos dos tutoriais não encontrei muitos problemas. No entanto, tive algumas dúvidas ao tentar elaborar um projeto mais complexo, sendo que a principal foi a seguinte:

Preciso que o NCL informe a um arquivo Java qual opção foi selecionada dentre "n" possíveis de um menu, e, dependendo dessa seleção, abrir uma página web correspondente. É possível???

Agradeço a atenção desde já,

Att.

 Gabriel Paduan

Autor: Gabriel Paduan


88 comentários

  • 820d3515c25dc6c1319875ee4fed9224?only path=false&size=50&d=404Carlos de Salles Soares Neto(usuário não autenticado)
    19 de Setembro de 2007, 20:21

     

    Tem informações sobre como fazer isso no Wiki:

    www.​soft​ware​publ​ico.​gov.​br/d​otlr​n/cl​ubs/​ging​a/gi​ngan​cl/x​owik​i/gi​ngan​cl_j​ava

    Para chamar a função, digamos MyFunction, de um XLet, você precisa criar uma propriedade cujo atributo name seja o nome da função que deseja chamar:

    <media id="teste" src="Teste.class">
       <property name="MyFunction"/>
    </media>

    Agora é necessário usar um elo para chamar a função usando o papel "set". Digamos que você deseja chamar a função quando iniciar um vídeo cujo id é "video1", passando como parâmetro "argumento". O elo ficaria assim:

    <link xconnector="onBeginSet">
       <bind role="onBegin" component="video1"/>
       <bind role="set" component="teste" interface="MyFunction">
          <bindParam name="var" value="argumento"/>
       </bind>
    </link>

    Dê um feedback sobre o Wiki.

  • 80281508d24634177d10e7b503d515bf?only path=false&size=50&d=404Gabriel Paduan(usuário não autenticado)
    20 de Setembro de 2007, 16:51

     

    Carlos,

     Obrigado pela dica do wiki, consegui rodar o arquivo do Xlet sem problemas. No entanto, a parte do código que me passou para a passagem de parâmetros não funcionou. Para utilizar como teste, resolvi testar a passagem de parâmetros alterando o texto da legenda no exemplo do Xlet. O que fiz no código foi o seguinte:

    - No código Java do exemplo, criei dois métodos, um chamado setText(String text) e um chamado getText(). Na linha onde escrevo o texto a ser apresentado, fiz a seguinte alteração: "g.drawString(getText(), 0, 15);"

     - No código NCL as alterações foram as seguintes:

    <media id="appJava" src="bin/ncl/teste/LegendaXlet2.class" descriptor="dAppJava">
                <property name="setText"/>
    </media>

    <link id="lSetSubtitleText" xconnector="connBase#onBeginSet">
           <bind component="video1" role="onBegin"/>
           <bind component="appJava" interface="setText" role="set">
                 <bindParam name="var" value="Legenda de Demonstracao"/>
           </bind>
    </link>

    Agradeço desde já a atenção de todos,

     Att,

    Gabriel Paduan

     

    • 6958a7d3f20a68182800b45d6134fedf?only path=false&size=50&d=404Rafael Rodrigues(usuário não autenticado)
      20 de Setembro de 2007, 18:46

       

      Gabriel,

       Uma observação sobre o seu NCL: o conector "onBeginSet" está em sua base de conectores "connBase"?

      Em segundo lugar, seu NCL está escrito de tal forma que você está chamando uma função de seu Xlet antes de iniciá-lo. Isso porque, ao inciar o vídeo você chama uma função no nó Java. Você deve escrever seu NCL de forma que você tenha garantias que ele foi iniciado.

      Eu tentei reproduzir seu exemplo abaixo, com uma alteração: ao iniciar o objeto de mídia Java eu chamo o método "setText". De uma olhada no código e veja se fica mais esclarecedor:

      java:

      package ncl.examples.xlet;

      import java.awt.BorderLayout;
      import java.awt.Color;
      import java.awt.Component;
      import java.awt.Container;
      import java.awt.Graphics;

      import javax.tv.graphics.TVContainer;
      import javax.tv.xlet.Xlet;
      import javax.tv.xlet.XletContext;
      import javax.tv.xlet.XletStateChangeException;

      public class LegendaXlet implements Xlet{
          XletContext thisContext;
          private String text;
          public void initXlet(XletContext ctx) throws XletStateChangeException {
              thisContext = ctx;
              text = "Legenda2 de Demonstra\u00E7\u00E3o 2";
          }
          public void startXlet() throws XletStateChangeException {
              System.out.println("Starting");
              Container rootContainer = TVContainer.getRootContainer(thisContext);
              rootContainer.setBackground(Color.BLUE);
              Component legenda = new Component (){
                  public void paint(Graphics g){
                      g.setColor(Color.BLACK);
                      g.fillRect(0, 0, 1024, 40);
                      g.setColor(Color.WHITE);
                      g.drawString(getText(), 0, 15);
                  }
              };
              rootContainer.setLayout(new BorderLayout());
              rootContainer.add(legenda, BorderLayout.CENTER);
          }
         
          public void pauseXlet() {
          }
         
          public void destroyXlet(boolean unconditional) throws XletStateChangeException {
             
          }
         
          public void setText(String text){
              this.text = text;
              System.out.println("teste");
          }
          public String getText(){
              return text;
          }
      }

       

      <?xml version="1.0" encoding="ISO-8859-1"?>

      <ncl id="exemplo02"
      xmlns="http://www.ncl.org.br/NCL3.0/EDTVProfile">
         <head>
            <regionBase>
               <region id="rgTV" width="1920" height="1080">
                  <region id="rgTitulo1" left="448" top="116" width="1024" height="40" />
                  <region id="rgVideo1" left="448" top="156" width="1024" height="768" />
               </region>
            </regionBase>

            <descriptorBase>
               <descriptor id="dTitulo1" region="rgTitulo1">
                  <descriptorParam name="border" value="none" />
                  <descriptorParam name="x-classpath" value="./bin/" />
               </descriptor>
               <descriptor id="dVideo1" region="rgVideo1">
                  <descriptorParam name="soundLevel" value="1" />
               </descriptor>
            </descriptorBase>

            <connectorBase>
               <importBase alias="connectors" documentURI="connectorBase.ncl" />
               <causalConnector id="onBeginSet">
                    <connectorParam name="var"/>
                    <simpleCondition role="onBegin"/>
                    <simpleAction role="set" value="$var"/>
               </causalConnector>
            </connectorBase>
         </head>

         <body>
            <port id="pInicio" component="video1" />

            <media id="titulo1" src="bin/ncl/examples/xlet/LegendaXlet.class" descriptor="dTitulo1">
                <property name="setText"/>
            </media>
            <media type="video/mpeg" id="video1" src="media/video1.mpg" descriptor="dVideo1" />

      <link id="lSetSubtitleText" xconnector="onBeginSet">
             <bind component="titulo1" role="onBegin"/>
             <bind component="titulo1" interface="setText" role="set">
                   <bindParam name="var" value="Legenda para Teste do Set Prop"/>
             </bind>
      </link>

            <link id="lVideo1Titulo1Start" xconnector="connectors#onBegin1StartN">
               <bind component="video1" role="onBegin" />
               <bind component="titulo1" role="start" />
            </link>
           
            <link id="lVideo1Titulo1Stop" xconnector="connectors#onEnd1StopN">
               <bind component="video1" role="onEnd" />
               <bind component="titulo1" role="stop" />
            </link>
         </body>
      </ncl>­

      • 80281508d24634177d10e7b503d515bf?only path=false&size=50&d=404Gabriel Paduan(usuário não autenticado)
        22 de Setembro de 2007, 10:07

         

        Rafael,

        Muito obrigado pela ajuda, agora sim entendi como funciona a passagem de parâmetros do NCL pro java, o código funcionou perfeitamente...

        Bom, consegui fazer o código funcionar e, quando começei a fazer outros testes utilizando esse conceito surgiu uma dúvida: Nesses exemplos estava fazendo minha classe java extender da classe Xlet, seria possível a passagem de parâmetros para uma classe comum de java? Ao fazer esse teste não obtive sucesso...

        Outro fato estranho que me aconteceu foi o seguinte: Eu só consigo pegar o valor setado pelo NCL no momento que estou inserindo um componente na tela.. No código:

         public void startXlet() throws XletStateChangeException {
             //Aqui o valor da minha variável corresponde ao valor inicial, e nao o setado pelo NCL.

                Container rootContainer = TVContainer.getRootContainer(thisContext);
                Component legenda = new Component() {
                    public void paint(Graphics g){
                        g.setColor(Color.BLACK);
                        g.fillRect(0, 0, 1024, 40);
                        g.setColor(Color.WHITE);
                        g.drawString(getText(), 0, 15);

                        // Aqui a passagem de parâmetros funciona, o valor apresentado na tela é o que o NCL me passou...
                    }
                };
                rootContainer.setLayout(new BorderLayout());
                rootContainer.add(legenda, BorderLayout.CENTER);
            }

         No entanto, quando tento utilizar esse parâmetro fora dessa inserção de componente, o valor que é mostrado é o valor inicial da minha variável...

         Bom pessoal, agradeço mais uma vez a ajuda que estou recebendo e a atenção de todos,

        Att,

        Gabriel Paduan 

         

         

        • 6958a7d3f20a68182800b45d6134fedf?only path=false&size=50&d=404Rafael Rodrigues(usuário não autenticado)
          24 de Setembro de 2007, 16:42

           

          Gabriel,

          1. Os parâmetros podem ser passados apenas para a classe principal, ou seja, você só é capaz de invocar métodos na classe principal.
           

          2. Na verdade a passagem de parâmetro no seu exemplo é realizada apenas após o término da execução do método "startXlet" (que é executado quando é iniciada a apresentação do nó Java). Porém, no Java o método "paint" de um componente AWT é chamado repetidas vezes para repintar o componente, ou seja, pelo menos uma vez o componente foi pintado com o texto antigo, mas, assim que termina a execução do método "startXlet" o método para alterar o texto é invocado.  O que acontece é que esse processo é tão rápido que é imperceptível.

           Imagino que você esteja se perguntando se existe algum meio de se passar parâmetros antes da inicialização (aos moldes como seria pela execução a partir de uma linha de comando). Existe sim. Os Xlets permitem a captura de argumentos passados para a sua inicialização.

          Você pode utilizar o parâmetro do descritor cujo nome é x-args. Esse parâmetro permite a passagem de uma String que pode ser recuperada dentro do Xlet através da seguinte rotina:

          xletContext.getXletProperties(XletContext.ARGS)

          Essa rotina retorna uma String.

          Um abraço,

          Rafael
           

          • 80281508d24634177d10e7b503d515bf?only path=false&size=50&d=404Gabriel Paduan(usuário não autenticado)
            26 de Setembro de 2007, 14:13

             

            Rafael,

            Mais uma vez obrigado pela ajuda com relação a passagem dos parâmetros, compreendi melhor como ela funciona e estou evoluindo em meus estudos...

             Em meu último teste, estava fazendo o seguinte:

            Ao clicar um um botão do controle remoto(botao vermelho por exemplo), o NCL chama um Xlet que apresenta na tela em forma de legenda o conteúdo de um arquivo texto previamente gravado. No entanto, se esse arquivo for modificado, esse Xlet não atualiza o valor para ser apresentado na tela, o valor mostrado é o último que foi gravado no arquivo.Seria possível invocar um método de "refresh" no java???

            Arquivo java:

            public class ConnectionXlet implements Xlet{
               
                XletContext thisContext;
               
                public void initXlet(XletContext ctx) throws XletStateChangeException {
                    thisContext = ctx;
                }
                public void startXlet() throws XletStateChangeException {
                    Container rootContainer = TVContainer.getRootContainer(thisContext);
                    Component legenda = new Component() {
                        public void paint(Graphics g){
                            g.setColor(Color.BLACK);
                            g.fillRect(0, 0, 1024, 40);
                            g.setColor(Color.WHITE);
                            g.drawString(getText(), 0, 15);
                        }
                    };
                    rootContainer.setLayout(new BorderLayout());
                    rootContainer.add(legenda, BorderLayout.CENTER);
                }
               
                private String getText() {
                    Database database = new Database();
                    String text = database.readData();
                    return text;
                }
               
                public void pauseXlet() {}
               
                public void destroyXlet(boolean unconditional) throws XletStateChangeException {}
            }

            Obrigado desde já pela atenção,

            Att,

            Gabriel Paduan

            • 5a82d82e341eb9065577cf78128f296a?only path=false&size=50&d=404Marcelo Moreno(usuário não autenticado)
              18 de Novembro de 2007, 18:38

               

              Ola, Gabriel.

                 Algum progresso com o refresh de seu texto no Xlet?

              []s
              Moreno

              • 80281508d24634177d10e7b503d515bf?only path=false&size=50&d=404Gabriel Paduan(usuário não autenticado)
                19 de Novembro de 2007, 18:06

                 

                Ola Marcelo,

                Desculpe pela demora no retorno, estive trabalhando em outro projeto e não acessei o forum durante esses dias.

                Com relação ao progresso no refresh, esta tudo ok agora. Reestudei o que estava querendo implementar e aprimorei minha lógica, daí ficou mais fácil entender e executar o que eu realmente queria fazer, e além disso, compreendi melhor a passagem de parâmetros entre o NCL e o Java.

                Obrigado pela atenção,

                Att.

                Gabriel Paduan 

Concurso ITU-T de Aplicações para IPTV 2012

13 de Agosto de 2012, 19:38, por Desconhecido

Gostaríamos de lembrar aos possíveis interessados que o prazo de registro para participação no Concurso ITU-T de Aplicações para IPTV 2012 (IPTV Application Challenge) se encerra nesta semana, dia 15 de agosto de 2012. Já o prazo para a submissão de aplicações se encerra no dia 07 de setembro de 2012.



NCL Eclipse 1.6 disponível

10 de Janeiro de 2012, 21:19, por Desconhecido

Caros membros da Comunidade Ginga,



Concursos de Aplicações Ginga-NCL

22 de Setembro de 2011, 3:22, por Desconhecido

    Gostaríamos de relembra-los de que há dois concursos de aplicações Ginga-NCL com inscrições ainda abertas. O convite é aberto a toda a comunidade de desenvolvedores de aplicações para o Middleware Ginga-NCL, em nível internacional. São os seguintes concursos:



Novas versões: Ginga e Ginga-NCL Virtual Set-top Box (v.0.12.3)

1 de Agosto de 2011, 20:58, por Desconhecido



Algumas Boas Notícias da Comunidade Ginga

28 de Julho de 2011, 21:31, por Desconhecido

Autor: Roberto Azevedo