Tecla de atalho para JPopupMenu

3 respostas
igortdt

Pessoal estou querendo acessar um JPopupMenu apartir de uma tecla de atalho.
Ja fiz o seguinte código:

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

public class Teste extends JFrame {
	
	JPopupMenu popupMenu;
	JButton okButton;
	
	public Teste() {
		Action okAction = new MessageAction("OK", "Ação OK");
		Action helpAction = new MessageAction("F1", "Ação Ajuda");

		okButton = new JButton(okAction);

		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		c.add(new JTextField(40));
		c.add(okButton);
		
		getRootPane().setDefaultButton(okButton);
		
		getRootPane().getActionMap().put("F1", helpAction);
		getRootPane().getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0), "F1");


		setSize(640, 480);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}

	class MessageAction extends AbstractAction {
		String _msg;
		String nomeEvento;

		MessageAction(String name, String msg) {
			putValue(NAME, name);
			_msg = msg;
			nomeEvento = name;			
		}

		public void actionPerformed(ActionEvent evt) {			
			System.out.println(nomeEvento);
			if(nomeEvento.equals("F1")){				
				abrirPopup();
			}
		}
		
		private void abrirPopup(){  
			popupMenu = new JPopupMenu();
		
			JMenuItem file = new JMenuItem("File");
			JMenuItem edit = new JMenuItem("Edit");
			JMenuItem help = new JMenuItem("help");
			
			popupMenu.add(file);
			popupMenu.add(edit);
			popupMenu.add(help);
						
			popupMenu.show(okButton, 0, 10);  			
		}
		
		private void fecharPopup(){
			popupMenu.setVisible(false);
		}
	}
	
	
	
	public static void main(String[] args) {
		Teste t = new Teste();
		
		t.setVisible(true);
	}
}

Ai funciona perfeitamente da primeira vez que eu clicar em “F1”, o menu abre direitinho, mais caso eu coloque o foco em qualquer componente da tela essa funcionalidade nao funciona mais.

O que eu devo fazer para isso funcionar a qualquer momente da vida da aplicação ???

3 Respostas

von.juliano

Você pode implementar a interface KeyListener, assim, quando vc pressionar F1 a ação será executada, não importando onde está o foco.

Blz? Flw! :thumbup:

igortdt

Vc pode me passar um exemplo de como fazer isso?

von.juliano
Ao implementar KeyListener, então vc vai ter que implementar seus 3 métodos:
public void keyTyped(KeyEvent e)

public void keyPressed(KeyEvent e)

public void keyReleased(KeyEvent e)
Aí você pode colocar algo + ou - assim no seu método keyPressed():
if (e.getKeyCode() == KeyEvent.VK_F1) {
	abrirPopup();
}
A grosso modo é isso, você só tem que implementar o método corretamente.

Blz? Flw! :thumbup:

Criado 27 de março de 2008
Ultima resposta 27 de mar. de 2008
Respostas 3
Participantes 2