Um dos metodos deste componente possui seguinte descricao:
setEchoChar
public void setEchoChar(char c)
Sets the echo character for this JPasswordField. Note that this is largely a suggestion, since the view that gets installed can use whatever graphic techniques it desires to represent the field. Setting a value of 0 indicates that you wish to see the text as it is typed, similar to the behavior of a standard JTextField.
Parameters:
c - the echo character to display
Pelo q entendi se a pessoa setar 0 (zero) ai ele fica c comportanmento semelhante ao do TextField, ou seja, exibe os caracteres. Eu testei colocando 0 (zero) e n aconteceu isto, alguem ai sabe oq eh?
(usando o NB 5)
Aproveitando a folga: oq seria esta propriedade “keymap” do JComponent?
JPasswordField t = new JPasswordField();
...
t.setEchoChar('0');
… vc estará utilizando o caractere ‘0’ como caractere de eco do JPasswordField. Olha, até onde eu sei, um char é na verdade um código numérico, o qual corresponde a um caractere. Pensando nisso, testei aqui o seguinte código:
JPasswordField t = new JPasswordField();
...
t.setEchoChar((char)0);
Aí funcionou certinho.
Imaginei que o caractere ‘0’ pudesse ter um código diferente de 0, mas fazendo um …
O código ASCII do caracter ‘0’ é o decimal 48, ou 0x30 em hexadecimal.
Faça isto:
System.out.println ((int) '0');
Deve imprimir 48.
Character.getNumericValue(char) é um método que transforma um caracter que em Unicode representa um algarismo e obtém seu valor numérico (não código ASCII.) Portanto, se você passar para Character.getNumericValue o caracter ‘٨’ (Unicode ‘\u0668’) , que em árabe é 8, ele lhe retornará o valor 8.
Vlw galera, pegou, entao o codigo ascii do 0 e do ‘0’ sao diferentes??? Outra coisa aonde vejo a tabela dos codigos ASCII??? E esta propriedade “keymap” serve pra q? Eu pesquisei mas n entendi.
Não é bem isso… 0 = 0 (O próprio int 0 é um código ASCII) ‘0’ = 48 (O caractere ‘0’ é representado em ASCII pelo int 48 )
Olha só, eu não conhecia também, mas dei uma fuçada na API e percebi algumas coisas a respeito. Antes, só corrigindo uma coisinha que vc mencionou, exite alguns métodos envolvendo a interface Keymap na classe JTextComponent, e não na JComponent. Não pesquisei se dá pra associar um objeto de uma classe que implemente Keymap (chamemos apenas de "um Keymap) a outras classes da API J2SE…
Pelo que estava lendo, o uso de Keymap envolve saber algo sobre Action, TextAction e KeyStroke. Vou tentar escrever oq ue entendi até agora. IMPORTANTE: Estou escrevendo o que eu entendi e só algumas linhas gerais, não posso garantir que esteja totalmente certo. Tratemos esse tópico como um brainstorming, ok?
. .:Interface Action:.
Essa interface parece que é uma versão mais robusta da ActionListener (Action, inclusive, herda de ActionListener). Quando se cria uma classe que implementa Action (chamemos qualquer uma dessas classes apenas de “uma Action”), além de ser possível implementar o método actionPerformed(…), é possível associar a ela outras propriedades, pra citar algumas, como um texto que pode ser usado como hint por um botão ou então como título em um menu; um ícone que pode ser exibido por um menu; é possível manipular a “habilitabilidade” desta Action, deixando possível, por exemplo, habilitar/desabilitar a Action em si ao invés do componente ao qual aquela está associada;
. .:Classe AbstractAction (Abstrata):.
AbstractAction implementa Action e traz implementações padrão para os métodos get e set, quando utilizados para recuperar as propriedades referentes ao ícone e ao texto, e também traz implementação padrão para a verificação de habilitado/desabilitado e mais algumas outras funções. Só fica faltando para o desenvolvedor, basicamente, implementar o actionPerformed
. .:Classe TextAction (Abstrata):.
TextAction herda de AbstractAction. Ela traz recursos que permitem sabermos qual o TextComponent é o alvo da Action. Isto porque parece que de alguma forma as Actions são compartilhadas, ou podem ser compartilhadas, não sei ao certo. Estes recursos são os métodos getFocusedComponent e getTextComponent
. .:Classe KeyStroke:.
A classe KeyStroke é basicamente um evento de teclado, seja este evento o pressionar, o soltar ou o teclar uma tecla, usando ou não teclas modificadoras (alt, ctrl, etc…).
Normalmente, usamos KeyListeners para ouvir todo e qualquer tipo de evento de teclado e então filtramos os eventos de teclado que realmente nos interessam. Já com o uso de KeyStrokes, podemos associar diretamente uma ActionEvent a uma combinação de teclas representada por um KeyStroke. Tal associação pode ser feita através de uma Keymap
. .:Interface Keymap:.
Finalmente, uma Keymap representa uma coleção de pares (KeyStroke;Action). A interface Keymap permite associar um KeyStroke a um Action.
.
Vou tentar fazer algum programinha de exemplo e, se conseguir fazer algo relevante, eu posto aqui, ok!?
Espero ter ajudado!
Vlw mantu, tipo eu entendi mais ou menos isso tb, mas, como vc, “era o q eu tinha entendido” e nao sabi se era o correto, acho q este keymap associa 1 combinacao de keys do teclado a 1 action msm, se vc copnseguir algo, posta ai, flw
Olha pessoal, consegui fazer alguma coisinha, mas acho que está muitíssimo aquém do que se pode fazer usando esses recursos… Parece ser algo bem poderoso, se souber usar direitinho.
Vou postar o código aqui mesmo, ok?
package temp;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.KeyStroke;
import javax.swing.text.JTextComponent;
import javax.swing.text.Keymap;
import javax.swing.text.TextAction;
public class KeymapTest {
public KeymapTest(){
JFrame frame = new JFrame();
frame.setTitle("Teste");
frame.setSize(300, 85);
frame.setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE);
frame.addWindowListener(
new WindowAdapter() {
public void windowClosed(WindowEvent e) {
System.exit(0);
}
}
);
JButton btn = new JButton("Sair");
btn.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
);
JPasswordField t = new JPasswordField();
t.setEchoChar((char)0);
KeyStroke
detach = KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.CTRL_MASK),
clear = KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.ALT_MASK + InputEvent.CTRL_MASK),
selectAll = KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK)
;
Keymap keymap = JTextComponent.getKeymap(JTextComponent.DEFAULT_KEYMAP);
keymap.addActionForKeyStroke(
detach,
new DetachAction(null, new Color(225, 225, 180))
);
keymap.addActionForKeyStroke(
clear,
new ClearAction()
);
keymap.addActionForKeyStroke(
selectAll,
new SelectAllAction()
);
Container app = frame.getContentPane();
app.setLayout(new BorderLayout());
app.add(t, BorderLayout.CENTER);
app.add(btn, BorderLayout.SOUTH);
frame.setVisible(true);
}
public static void main(String[] args) {
System.out.println((int) '0');
try{
KeymapTest app = new KeymapTest();
}catch(Throwable t) {
t.printStackTrace();
}finally{
//System.exit(0);
}
}
/*Classes Internas~.........................................................*/
public class DetachAction extends TextAction{
private Color
defaultColor = Color.WHITE,
detachColor = Color.YELLOW
;
public DetachAction(Color defaultBackground, Color detachedBackground) {
super(DetachAction.class.getName());
if(defaultBackground != null)
defaultColor = defaultBackground;
if(detachedBackground != null)
detachColor = detachedBackground;
}
public void actionPerformed(ActionEvent e) {
JTextComponent textComponent = getTextComponent(e);
Color currentColor = textComponent.getBackground();
if(currentColor.equals(detachColor))
textComponent.setBackground(defaultColor);
else
textComponent.setBackground(detachColor);
}
}
public class ClearAction extends TextAction{
public ClearAction() {
super(ClearAction.class.getName());
}
public void actionPerformed(ActionEvent e) {
getTextComponent(e).setText("");
}
}
public class SelectAllAction extends TextAction{
public SelectAllAction() {
super(SelectAllAction.class.getName());
}
public void actionPerformed(ActionEvent e) {
JTextComponent textComponent = getTextComponent(e);
textComponent.selectAll();
}
}
}
Há alguns paus menores, mas, é como eu disse, esse foi meu primeiro contato com essa joça de Keymap… :lol:
Qq dúvida perguntem, ok?
Divirtam-se!