É o seguinte, eu tenho uma classe extendendo JFrame e implementando keylistener, é aquele do java como programar 3 edicao, essa classe tem apenas um jtextarea e é adicionada com
getContentPane().add(textArea);
mas se eu usar um container para adicionar meus componentes o keylistener para de funcionar. Na classe simples eu adiciono keylistener usando
addKeyListener(this);
na classe com varios componentes eu uso
c.addKeyListener(this);
mas não funciona, alguem sabe o que pode ser?? O programa não dispara exceçoes.
Estou tentando entender seu exemplo. Você tem um Frame, e quando você adiciona um container esterno, o listner pára de funcionar. Certo? Ou o seu container é criado internamente mesmo?
Se for externo, você vai ter que passar o listner de alguma forma para o container, ou ainda, implementar o listner em seu container.
Se não form poste parte de seu código ai, pra podermos avaliar melhor.
cara,vá adicinando um listener por componente…
componente.addKeyListener(this);
Vc tah tentando adicionar o Listener ao conteiner é isso???(acho q não entendi direito…)
O codigo é este, ele está funcionando com apenas a JTextArea, mas se voce descomentar o codigo do JButton e comentar o outro codigo ele para de receber os eventos
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class KeyDemo extends JFrame implements KeyListener{
private String line1 = "", line2 = "";
private String line3 = "";
private JTextArea textArea;
//private JButton btn;//descomente este
private Robot rb;
public KeyDemo() {
super("Demostrando pressionamento de teclas");
textArea = new JTextArea(10,15);
textArea.setText("Pressione uma tecla no teclado!");
textArea.setEnabled(false);
/*btn = new JButton("Clique");//descomente este
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
}
});*/
try{
rb = new Robot();
}
catch(AWTException e){
}
addKeyListener(this);//comente aqui
//Container c = getContentPane();
//c.addKeyListener(this);
//c.setLayout(new FlowLayout());
//c.add(textArea);
//c.add(btn);
getContentPane().add(textArea);//comente aqui
setBounds(0,0,400,200);
show();
}
public void keyPressed(KeyEvent e){
line1 = "Key pressed: " + e.getKeyText(e.getKeyCode());
setLines2and3(e);
}
public void keyReleased(KeyEvent e){
line1 = "Key released: " + e.getKeyText(e.getKeyCode());
setLines2and3(e);
}
public void keyTyped(KeyEvent e){
line1 = "Key typed: " + e.getKeyText(e.getKeyCode());
setLines2and3(e);
}
private void setLines2and3(KeyEvent e){
line2 = "This is a " + (e.isActionKey() ? "" : "not ") + "an action key";
String temp = e.getKeyModifiersText(e.getModifiers());
line3 = "Modifiers keys pressed: " + (temp.equals("") ? "none" : temp);
textArea.setText(line1 + "
" + line2 + "
" + line3 + "
");
}
public static void main(String args[]){
JFrame.setDefaultLookAndFeelDecorated(true);
KeyDemo app = new KeyDemo();
app.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
}
para adicionar o Jbutton descomente o codigo comentado e comente aqueles marcados
O problema eh o seguinte. O único componente na tela que xonsegue receber foco é o botão, então adicione isto em vez do actionPerformed:
btn.addKeyListener(this);
Irá funcionar.
O problema é que o único component com o evento de keylistener era o container, e não tinha como dr o foco nele, par então pressionar uma tecla.
Se você quiser que o JFrame responda aos eventos do teclado, é só vc sobrescrever o método :
public boolean isFocusTraversable() {
return true;
}
ou
setFocusable(true);
Assim ele poderá responder aos eventos do teclado…
[]'s
Chico[/code]
tentei sobrescrever o metodo
public boolean isFocusTraversable() {
return true;
}
e tambem tentei o
setFocusable(true);
mas continua sem responder as teclas, quanto adicionar o keylistener ao botao, ele pára de funcionar se perder o foco. Preciso que a keylistener continue funcionando independente do foco. Caso achem que é código mal intencionado, fiquem tranquilos, preciso disto para fazer alguns bloqueios no windows, como impedir o acesso ao menu iniciar. Se tiver alguma sugestão diferente. É só para windows mesmo, até pesquisei algo em assembly mas não encontrei nada para iniciante.
já tentei os tres métodos mencionados, mas no metedo de adicionar o keylistener ao botao nao serve se o botao perder o foco. preciso de algo independente de foco.
O meu problema é impedir o acesso ao menu iniciar, consigo bloquear a tecla windows, alt+tab, mas o ctrl+alt+del está meio dificil pois é possivel chamar o task manager usando ctrl+shift+esc, se tiver alguma sugestao alternativa… ja tentei procurar algo em assembly mas nao tem nenhum material para iniciante bom.