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
<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.
<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
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>
//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
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
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
Moreno