Eu estou desenvolvendo um sistema que é necessário que o usuário realize um login. Para isso, eu tenho que utilizar a linguagem java, to certo? com isso, eu tenho algumas perguntas:
1 -> nao encontrei um metodo que crie uma caixa de texto para entrar com a senha
2-> vou ter que recorrer a outra implementação como HAVI ou open MHP???
3-> em outro tópico eu li alguém da equipe Ginga falando que é possível criar aplicações java genérica. Ou seja, eu poderia criar qualquer tipo de aplicação java?? de qualquer API???
Obrigado.
Autor: Adonias Melo Jr.
1313 comentários
Um abraço, Rafael
Um abraço, Rafael
Minha dúvida é: vai ser preciso fazer o tratamento de evento toda vez que o usuário teclar alguma tecla do controle para poder inserir os caracteres na caixa de texto? Caso seja isso mesmo, eu poderia utilizar para isso tanto atw, havi ou dvb?
! Projeto 15 (NCLTextField) !
! !
! Objetivo: Proporcionar integração do NCL com um textfield, !
! passando parâmetros para uma classe Java. !
! !
! Características: !
! !
! - sincronismo: seleção de teclas no controle -> escrita do texto !
! selecionado no textfield !
! - interação do usuário: entrada de dados em um textfield através !
! da seleção no controle remoto !
! !
! Preparação: !
! !
! Para executar este exemplo, é necessário ter as seguintes mídias !
! no subdiretório media a partir do caminho do arquivo NCL: !
! 1) arquivo de vídeo chamado video1.mpg !
! 2) arquivo de vídeo chamado botao_vermelho.gif !
! !
! Para executar este exemplo, é necessário ter as seguintes mídias !
! no subdiretório connectors a partir do caminho do arquivo NCL: !
! 1) arquivo de conectores chamado composerConnectorBase.conn !
! !
! Para executar este exemplo, é necessário ter as seguintes mídias !
! no subdiretório bin\ncl\textfield a partir do caminho do arquivo NCL: !
! 1) arquivo .class chamado TFInterface.class !
! 2) arquivo .class chamado TFXlet.class !
! 3) arquivo .class chamado TFXLet$1.class !
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--> <ncl id="project15" xmlns="http://www.ncl.org.br/NCL3.0/EDTVProfile"> <head>
<!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! BASE DE CONECTORES: !
! definem o comportamento dos elos !
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<connectorBase>
<importBase documentURI="connectors/composerConnectorBase.conn" alias="connBase"/>
<importBase documentURI="connectors/myConnectors.conn" alias="myConnBase"/>
</connectorBase>
<!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! BASE DE REGIÕES: !
! define as regiões na tela onde as mídias são apresentadas !
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<regionBase>
<region id="rgTV" width="1280" height="1024">
<region id="rgVideo1" left="512" top="258" width="320" height="240"/>
<region id="rgBotao" left="0" top="0" width="0" height="0"/>
<region id="rgAppJava" left="512" top="498" width="1" height="1"/>
</region>
</regionBase>
<!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! BASE DE DESCRITORES: !
! define como as mídias são apresentadas !
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<descriptorBase>
<descriptor id="dVideo1" region="rgVideo1"/>
<descriptor id="dBotao" region="rgBotao"/>
<!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! DESCRITOR XLET !
! DescriptorParam criado para a inserção de uma mídia Java !
! São necessários o argumento name="x-classpath" e o argumento !
! value="./bin/", subdiretório principal a partir do caminho do NCL, !
! onde estão as classes Java que serão utilizadas no projeto. !
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<descriptor id="dAppJava" region="rgAppJava">
<descriptorParam name="x-classpath" value="./bin/"/>
</descriptor>
</descriptorBase>
</head> <body>
<!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! PONTO DE ENTRADA: !
! indica o componente onde o programa inicia !
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<port id="pInitialize" component="video1"/> <!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! MÍDIAS: !
! define o local dos arquivos de mídia e as associa com seus descritores !
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<media type="video/mpeg" id="video1" src="media/video1.mpg" descriptor="dVideo1"/>
<media type="image/gif" id="botao" src="media/botao_vermelho.gif" descriptor="dBotao"/>
<!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! MÍDIA XLET !
! Property criada na mídia para a passagem de parâmetros, !
! referenciando o método public da classe para onde a passagem !
! será feita. !
! A passagem ocorre quando algum botão do controle é presionado, !
! fazendo com que o NCL chame o método setText da classe TFXlet, !
! passando para ele uma string desejada, no caso, o código das !
! teclas do controle. Todo o tratamento das informações passadas !
! pelo NCL é feito dentro da classe Java. !
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<media id="appJava" src="bin/ncl/textfield/TFXlet.class" descriptor="dAppJava">
<property name="setText"/>
</media>
<!--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! ELOS !
! define os elos que regem o sincronismo entre as mídias !
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<!-- Quando o botão POWER é pressionado no controle, o NCL passa o parâmetro "POWER" para o Java que encerra a aplicação -->
<link id="lSelecionaBotaoPower" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="POWER"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="POWER"/>
</bind>
</link>
<!-- Quando o botão GUIDE é pressionado no controle, o NCL passa o parâmetro "GUIDE" para o Java que escreve GUIDE no textfield -->
<link id="lSelecionaBotaoGuia" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="GUIDE"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="GUIDE"/>
</bind>
</link>
<!-- Quando o botão INFO é pressionado no controle, o NCL passa o parâmetro "INFO" para o Java que escreve INFO no textfield -->
<link id="lSelecionaBotaoInfo" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="INFO"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="INFO"/>
</bind>
</link>
<!-- Quando a seta pra cima é pressionada no controle, o NCL passa o parâmetro "CURSOR_UP" para o Java que escreve CURSOR_UP no textfield-->
<link id="lSelecionaBotaoCURSOR_UP" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="CURSOR_UP"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="CURSOR_UP"/>
</bind>
</link>
<!-- Quando a seta pra baixo é pressionada no controle, o NCL passa o parâmetro "CURSOR_DOWN" para o Java que escreve CURSOR_DOWN no textfield-->
<link id="lSelecionaBotaoCURSOR_DOWN" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="CURSOR_DOWN"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="CURSOR_DOWN"/>
</bind>
</link>
<!-- Quando a seta pra esquerda é pressionada no controle, o NCL passa o parâmetro "CURSOR_LEFT" para o Java que permite o usuário posicionar o cursor do textfield-->
<link id="lSelecionaBotaoCURSOR_LEFT" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="CURSOR_LEFT"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="CURSOR_LEFT"/>
</bind>
</link>
<!-- Quando a seta pra direita é pressionada no controle, o NCL passa o parâmetro "CURSOR_RIGHT" para o Java que permite o usuário posicionar o cursor do textfield-->
<link id="lSelecionaBotaoCURSOR_RIGHT" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="CURSOR_RIGHT"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="CURSOR_RIGHT"/>
</bind>
</link>
<!-- Quando o botão OK é pressionado no controle, o NCL passa o parâmetro "OK" para o Java que seleciona o botão de OK-->
<link id="lSelecionaBotaoOk" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="ENTER"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="OK"/>
</bind>
</link>
<!-- Quando o botão VOLTA é pressionado no controle, o NCL passa o parâmetro "EXIT" para o Java que escreve EXIT no textfield-->
<link id="lSelecionaBotaoExit" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="EXIT"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="EXIT"/>
</bind>
</link>
<!-- Quando o botão vermelho é pressionado no controle, o NCL passa o parâmetro "BACKSPACE" para o Java que apaga o caracter anterior no textfield em relação a posição do cursor -->
<link id="lSelecionaBotaoVermelho" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="RED"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="BACKSPACE"/>
</bind>
</link>
<!-- Quando o botão verde é pressionado no controle, o NCL passa o parâmetro "BACKSPACE" para o Java que apaga o caracter anterior no textfield em relação a posição do cursor -->
<link id="lSelecionaBotaoVerde" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="GREEN"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="BACKSPACE"/>
</bind>
</link>
<!-- Quando o botão amarelo é pressionado no controle, o NCL passa o parâmetro "BACKSPACE" para o Java que apaga o caracter anterior no textfield em relação a posição do cursor -->
<link id="lSelecionaBotaoAmarelo" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="YELLOW"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="BACKSPACE"/>
</bind>
</link>
<!-- Quando o botão azul é pressionado no controle, o NCL passa o parâmetro "BACKSPACE" para o Java que apaga o caracter anterior no textfield em relação a posição do cursor -->
<link id="lSelecionaBotaoAzul" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="BLUE"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="BACKSPACE"/>
</bind>
</link>
<!-- Quando o botão 1 é pressionado no controle, o NCL passa o parâmetro "1" para o Java que escreve 1 no textfield-->
<link id="lSelecionaBotao1" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="1"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="1"/>
</bind>
</link>
<!-- Quando o botão 2 é pressionado no controle, o NCL passa o parâmetro "2" para o Java que escreve 2 no textfield-->
<link id="lSelecionaBotao2" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="2"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="2"/>
</bind>
</link>
<!-- Quando o botão 3 é pressionado no controle, o NCL passa o parâmetro "3" para o Java que escreve 3 no textfield-->
<link id="lSelecionaBotao3" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="3"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="3"/>
</bind>
</link>
<!-- Quando o botão 4 é pressionado no controle, o NCL passa o parâmetro "4" para o Java que escreve 4 no textfield-->
<link id="lSelecionaBotao4" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="4"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="4"/>
</bind>
</link>
<!-- Quando o botão 5 é pressionado no controle, o NCL passa o parâmetro "5" para o Java que escreve 5 no textfield-->
<link id="lSelecionaBotao5" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="5"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="5"/>
</bind>
</link>
<!-- Quando o botão 6 é pressionado no controle, o NCL passa o parâmetro "6" para o Java que escreve 6 no textfield-->
<link id="lSelecionaBotao6" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="6"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="6"/>
</bind>
</link>
<!-- Quando o botão 7 é pressionado no controle, o NCL passa o parâmetro "7" para o Java que escreve 7 no textfield-->
<link id="lSelecionaBotao7" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="7"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="7"/>
</bind>
</link>
<!-- Quando o botão 8 é pressionado no controle, o NCL passa o parâmetro "8" para o Java que escreve 8 no textfield-->
<link id="lSelecionaBotao8" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="8"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="8"/>
</bind>
</link>
<!-- Quando o botão 9 é pressionado no controle, o NCL passa o parâmetro "9" para o Java que escreve 9 no textfield-->
<link id="lSelecionaBotao9" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="9"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="9"/>
</bind>
</link>
<!-- Quando o botão 0 é pressionado no controle, o NCL passa o parâmetro "0" para o Java que escreve 0 no textfield-->
<link id="lSelecionaBotao0" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="0"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="0"/>
</bind>
</link>
<!-- Quando o botão * é pressionado no controle, o NCL passa o parâmetro "*" para o Java que escreve * no textfield-->
<link id="lSelecionaBotao*" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="*"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="*"/>
</bind>
</link>
<!-- Quando o botão # é pressionado no controle, o NCL passa o parâmetro "#" para o Java que escreve # no textfield-->
<link id="lSelecionaBotao#" xconnector="connBase#onKeySelectionSetN">
<bind component="botao" role="onSelection">
<bindParam name="keyCode" value="#"/>
</bind>
<bind component="appJava" interface="setText" role="set">
<bindParam name="var" value="#"/>
</bind>
</link>
<!-- Inicia as midias javaApp e botao quando o video1 é iniciado-->
<link id="lBeginVideo1StartJavaApp" xconnector="connBase#onBeginStart">
<bind component="video1" role="onBegin"/>
<bind component="appJava" role="start"/>
<bind component="botao" role="start"/>
</link>
<!-- Encerra as midias javaApp e botao quando o video1 é terminado-->
<link id="lEndVideo1StopJavaApp" xconnector="connBase#onEndStop">
<bind component="video1" role="onEnd"/>
<bind component="botao" role="stop"/>
<bind component="appJava" role="stop"/>
</link>
</body>
</ncl> Java: package ncl.textfield; import java.awt.Button;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextField; public class TFInterface extends Frame { private static final long serialVersionUID = 7482303915525149546L;
private TextField textField;
private Button okButton;
private Panel panel;
public TFInterface() {
super("Teste");
setUndecorated(true);
setLocation(512, 498);
setSize(320,40);
buildInterface();
} private void buildInterface() {
add(getJPanel());
} private Panel getJPanel() {
if(panel == null) {
panel = new Panel();
panel.add(getTextField());
panel.add(getOkButton());
}
return panel;
} private Button getOkButton() {
if(okButton == null) {
okButton = new Button("OK");
}
return okButton;
} public TextField getTextField() {
if(textField == null) {
textField = new TextField();
textField.setColumns(10);
textField.requestFocus();
}
return textField;
}
public void pressOkButton() {
getOkButton().setEnabled(false);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
getOkButton().setEnabled(true);
}
public void updateTextFieldText(String text) {
int cursorPosition = getCursorPosition();
int currentCursorPositon = getCursorPosition();
char[] oldString = getTextField().getText().toCharArray();
char[] auxInsert = text.toCharArray();
char[] auxNewString = new char[oldString.length + auxInsert.length];
int i=0;
for(i=0;i<cursorPosition;i++) {
auxNewString[i] = oldString[i];
}
for(int k=0;k<auxInsert.length;k++,i++) {
auxNewString[i] = auxInsert[k];
}
for(;i<auxNewString.length;i++){
auxNewString[i] = oldString[cursorPosition];
cursorPosition++;
}
String newString = new String(auxNewString);
getTextField().setText(newString);
getTextField().setCaretPosition(++currentCursorPositon);
}
public void backspaceTextFieldText() {
int cursorPosition = getCursorPosition();
int currentCursorPositon = getCursorPosition();
char[] oldString = getTextField().getText().toCharArray();
String newString;
if(cursorPosition!=0) {
char[] auxNewString1 = new char[oldString.length-1];
int i=0;
for(i=0;i<cursorPosition-1;i++) {
auxNewString1[i] = oldString[i];
}
for(;i<oldString.length-1;i++) {
auxNewString1[i] = oldString[cursorPosition];
cursorPosition++;
}
newString = new String(auxNewString1);
}
else {
newString = new String(oldString);
}
getTextField().setText(newString);
getTextField().setCaretPosition(--currentCursorPositon);
}
public void updateCursor(String how) {
int cursorPosition = getTextField().getCaretPosition();
if(how.equals("UP") && cursorPosition < getTextField().getText().length()) {
getTextField().setCaretPosition(++cursorPosition);
}
else if(how.equals("DOWN") && cursorPosition > 0) {
getTextField().setCaretPosition(--cursorPosition);
}
}
private int getCursorPosition() {
return getTextField().getCaretPosition();
} } package ncl.textfield; import java.awt.BorderLayout;
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 TFXlet implements Xlet{
XletContext thisContext;
TFInterface tfInterface = new TFInterface();
String text = "";
private Component legenda;
public void initXlet(XletContext ctx) throws XletStateChangeException {
thisContext = ctx;
}
@SuppressWarnings("serial")
public void startXlet() throws XletStateChangeException {
Container rootContainer = TVContainer.getRootContainer(thisContext);
tfInterface.setVisible(true);
legenda = new Component() {
@Override
public void paint(Graphics g){
tfInterface.updateTextFieldText(getText());
tfInterface.getTextField().requestFocus();
}
};
rootContainer.setLayout(new BorderLayout());
rootContainer.add(legenda,BorderLayout.CENTER);
}
public void setText(String text) {
if(text.equals("BACKSPACE")) {
tfInterface.backspaceTextFieldText();
tfInterface.getTextField().requestFocus();
}
else if(text.equals("CURSOR_LEFT")) {
tfInterface.updateCursor("DOWN");
tfInterface.getTextField().requestFocus();
}
else if(text.equals("CURSOR_RIGHT")) {
tfInterface.updateCursor("UP");
tfInterface.getTextField().requestFocus();
}
else if(text.equals("OK")) {
tfInterface.pressOkButton();
tfInterface.getTextField().requestFocus();
}
else {
this.text = text;
legenda.repaint();
}
}
private String getText() {
return text;
}
public void pauseXlet() {}
public void destroyXlet(boolean unconditional) throws XletStateChangeException {
tfInterface.dispose();
}
} Desculpem pelo tamanho do post. Att. Gabriel Paduan
Vamos lá: -Essa é uma das formas de se fazer a recuperação das teclas utilizadas pelo controle remoto, ilustrando muito bem a ponte entre a NCL e o Java. -Minha primeira observação é que você utilizou algumas classes que não estão presentes no GEM. Olhando bem superficialmente observei a TextField e o Panel.
Como nosso emulador não possui uma implementação do Havi, sugiro a você criar uma implementação mínima dessas classes utilizando Component e Container. A API que você pode usar você encontra em (http://java.sun.com/javame/reference/apis/jsr218/ e java.sun.com/javame/reference/apis/jsr217/). -E, para finalizar, é possível capturar os eventos do controle remoto através da classe Java EventManager. Um abraço,
Rafael
Rafael