Olá,
Alguem saberia como eu faço para numa aplicação swing, em dado momento verificar se o usuário esta com uma tecla pressionada (ctrl no caso)?
pesquisando na internet achei muita coisa relacionada a addKeyListener e KeyAdapter, mas nen é meu caso de fazer evento e tratar quando ele apertar, meu caso é de naquela hora ver se esta apertado e pronto…
porque preciso disso?
tenho um tanto de botão multi-selecionáveis, e to colocando uma pequena funcionalidade de quando o usuário só passar o mouse sobre ele (addMouseListener - MouseAdapter - mouseEntered… ), se o ctrl tiver apertado, ele já seleciona… só mesmo para poupar clique do usuário…
att
Só se você adicionar um listener é que poderá saber se a tecla está ou não pressionada…
poizé… mas será que é o único jeito?
porque na verdade na hora que tenho que verificar, já estou dentro de outro listener… o do mouseEnter… ai precisaria de um jeito só de verificar naquela hora mesmo, sem tratar como evento…
Um MouseEvent (que é o objeto recebido por vários métodos do MouseAdapter) é derivado de InputEvent, e um InputEvent tem métodos que permitem determinar se a tecla Ctrl, Shift ou Alt está pressionada.
package guj;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class ExemploMouseEventComTeclaCtrl extends JFrame {
private JLabel lblCliqueAqui;
private JLabel lblATeclaShift;
private JLabel lblATeclaCtrl;
private JLabel lblATeclaAlt;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ExemploMouseEventComTeclaCtrl frame = new ExemploMouseEventComTeclaCtrl();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public ExemploMouseEventComTeclaCtrl() {
setBounds(100, 100, 450, 122);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
getContentPane().add(getLblCliqueAqui());
getContentPane().add(getLblATeclaShift());
getContentPane().add(getLblATeclaCtrl());
getContentPane().add(getLblATeclaAlt());
}
private void showCtrlAltShiftKeys(MouseEvent e) {
System.out.println(e);
if (e.isAltDown())
getLblATeclaAlt().setEnabled(true);
else
getLblATeclaAlt().setEnabled(false);
if (e.isShiftDown())
getLblATeclaShift().setEnabled(true);
else
getLblATeclaShift().setEnabled(false);
if (e.isControlDown())
getLblATeclaCtrl().setEnabled(true);
else
getLblATeclaCtrl().setEnabled(false);
}
private JLabel getLblCliqueAqui() {
if (lblCliqueAqui == null) {
lblCliqueAqui = new JLabel("Passe o mouse sobre este JLabel aqui...");
lblCliqueAqui.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
showCtrlAltShiftKeys(e);
}
@Override
public void mouseExited(MouseEvent e) {
showCtrlAltShiftKeys(e);
}
});
}
return lblCliqueAqui;
}
private JLabel getLblATeclaShift() {
if (lblATeclaShift == null) {
lblATeclaShift = new JLabel("A tecla Shift está pressionada");
lblATeclaShift.setEnabled(false);
}
return lblATeclaShift;
}
private JLabel getLblATeclaCtrl() {
if (lblATeclaCtrl == null) {
lblATeclaCtrl = new JLabel("A tecla Ctrl está pressionada");
lblATeclaCtrl.setEnabled(false);
}
return lblATeclaCtrl;
}
private JLabel getLblATeclaAlt() {
if (lblATeclaAlt == null) {
lblATeclaAlt = new JLabel("A tecla Alt está pressionada");
lblATeclaAlt.setEnabled(false);
}
return lblATeclaAlt;
}
}
Este exemplo só não é muito perfeito, porque quando você solta a tecla Shift, Ctrl ou Alt e o mouse está fora ou dentro do JLabel, o status não é atualizado (seria necessário também associar KeyListeners a essas teclas). Mas para o que você quer acho que está bom
É isso mesmo cara! valeu… o entanglement tinha acabado de postar a dica tambem… valeu pros dois ae… resolvido o prob