É 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.
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
importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassKeyDemoextendsJFrameimplementsKeyListener{privateStringline1="",line2="";privateStringline3="";privateJTextAreatextArea;//private JButton btn;//descomente esteprivateRobotrb;publicKeyDemo(){super("Demostrando pressionamento de teclas");textArea=newJTextArea(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=newRobot();}catch(AWTExceptione){}addKeyListener(this);//comente aqui//Container c = getContentPane();//c.addKeyListener(this);//c.setLayout(new FlowLayout());//c.add(textArea);//c.add(btn);getContentPane().add(textArea);//comente aquisetBounds(0,0,400,200);show();}publicvoidkeyPressed(KeyEvente){line1="Key pressed: "+e.getKeyText(e.getKeyCode());setLines2and3(e);}publicvoidkeyReleased(KeyEvente){line1="Key released: "+e.getKeyText(e.getKeyCode());setLines2and3(e);}publicvoidkeyTyped(KeyEvente){line1="Key typed: "+e.getKeyText(e.getKeyCode());setLines2and3(e);}privatevoidsetLines2and3(KeyEvente){line2="This is a "+(e.isActionKey()?"":"not ")+"an action key";Stringtemp=e.getKeyModifiersText(e.getModifiers());line3="Modifiers keys pressed: "+(temp.equals("")?"none":temp);textArea.setText(line1+""+line2+""+line3+"");}publicstaticvoidmain(Stringargs[]){JFrame.setDefaultLookAndFeelDecorated(true);KeyDemoapp=newKeyDemo();app.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}}
para adicionar o Jbutton descomente o codigo comentado e comente aqueles marcados
hmichel
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.
C
chicobento
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]
soaresinfo
tentei sobrescrever o metodo
publicbooleanisFocusTraversable(){returntrue; }
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.
soaresinfo
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.