2013-05-08 3 views
0

Я хотел бы знать, есть ли способ обнаружить ввод с клавиатуры, сосредоточив внимание на JpopupMenu. Это делается для удаления фокуса на JPopupMenu всякий раз, когда есть обнаружение ввода с клавиатуры. Это возможно?Обнаружение ввода клавиатуры при фокусировке на JpopupMenu (Java)

спасибо.

Ниже приведен упрощенный код, который я написал.

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import javax.swing.event.ChangeListener; import javax.swing.event.ChangeEvent; import java.net.*; import java.io.*; public class testClass { static JPopupMenu textPopupMenu = new JPopupMenu("MENU"); final static JTextArea textInput = new JTextArea(50,80); final static JPanel overallPanel = new JPanel(); final static JFrame overallFrame = new JFrame("Test"); public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { final ActionListener actionListener1 = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { textPopupMenu.setFocusable(false); } }; KeyListener textInputListener = new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { //Get the suggested words from the function and populate them to the JMenuItem textPopupMenu = new JPopupMenu("MENU"); for(int i=0;i<5;i++) { switch(i) { case 0: JMenuItem item1 = new JMenuItem("A"); textPopupMenu.add(item1); break; case 1: JMenuItem item2 = new JMenuItem("B"); textPopupMenu.add(item2); break; case 2: JMenuItem item3 = new JMenuItem("C"); textPopupMenu.add(item3); break; case 3: JMenuItem item4 = new JMenuItem("D"); textPopupMenu.add(item4); break; case 4: JMenuItem item5 = new JMenuItem("E"); textPopupMenu.add(item5); break; }; } textPopupMenu.setFocusable(true); if (textPopupMenu.isVisible()) { textPopupMenu.setLocation(0, 0 + 20); } else { textPopupMenu.show(textInput,0, 0 + 20); } } }; textInput.addKeyListener(textInputListener); overallPanel.add(textInput); overallFrame.getContentPane().add(overallPanel); overallFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);`enter code here` overallFrame.setSize(1000, 900); overallFrame.setLocationRelativeTo(null); overallFrame.setVisible(true); } }); } }
+0

Добавить того же ключевого прослушивателя в 'JPopupMenu'? – christopher

+0

Привет Крис, я попытался использовать этот textPopupMenu.addKeyListener (textInputListener); но, к сожалению, он не будет слушать какой-либо ввод с клавиатуры во время фокусировки. –

+0

Некоторый код может помочь нам с этой проблемой. – christopher

ответ

0

Да его можно сделать это с помощью registerKeyboardAction

KeyStroke keystroke = KeyStroke.getKeyStroke(KeyEvent.VK_PERIOD, 0, false); 
    jpopMenu.registerKeyboardAction(actionListener, keystroke, JComponent.WHEN_FOCUSED); 

JComponent.WHEN_FOCUSED позволит вам обнаружение входного сигнала с клавиатуры, а JPopMenu сфокусирован.

+0

Привет, Алпеш, спасибо за ваш ответ. Я попробовал ваш метод, однако это не сработало. Он все еще фокусируется на JPopupMenu. У меня есть textarea в фоновом режиме, и я не могу ничего писать в текстовом поле, пока JpopupMenu все еще находится в фокусе. –

+0

@StephenFebrian, сделайте ваш jpopmenu модальным ложным. –

+0

@StephenFebrian Можете ли вы вставить свой код, чтобы я мог понять, в чем проблема? –

1

Я не совсем уверен, почему они это сделали, но вы должны использовать JPopupMenu.addMenuKeyListener().

Когда я проверил это, события были доставлены дважды, поэтому мне пришлось сохранить время последнего события, полученного от event.getWhen(), и обрабатывать события, которые были новее, чем последнее сохраненное время.

Смежные вопросы