如何解决在按键
我正在创建一个工具,用于自动完成处理IDE(Java的自定义版本)的文本。下列类是弹出菜单,它会弹出以显示不同的填写可能性:
class Entry extends jpopupmenu implements KeyListener{
private JEditTextArea parent;
public Entry(String word,JEditTextArea _parent) {
super();
parent = _parent;
parent.add(this);
parent.addKeyListener(this);
add(word);
}
public void show(int x,int y) {
super.show(parent,x,y);
}
public void keypressed(KeyEvent key) {
setVisible(false);
setEnabled(false);
}
public void keyreleased(KeyEvent key) {}
public void keyTyped(KeyEvent key) {}
}
父级是一个JEditTextArea,afaik与swing包中的JTextArea共享其大部分功能。参数word只是开始键入的单词,作为稍后在代码中找到合适补全的模式。
问题是,一旦打开弹出窗口,它将阻止进一步输入新字符,您必须通过按ESC手动将其关闭。我试图将其设置为KeyListener并使其在击键时关闭,但到目前为止没有成功。我还尝试让它在任何击键上都显示一条简单的消息,但是无论我如何尝试,我都无法说服它对任何形式的键输入做出反应。有什么办法可以使它在传入的击键时关闭?
〜冈加那州
解决方法
我不能真正使用您提供的类,因为缺少某些类。因此,我只是创建了这个最小的工作示例,希望它能说明您的问题:
import javax.swing.*;
import java.awt.event.*;
public class Main {
public static void main(String[] args) {
//Creating elements
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton button = new JButton("click me!");
JPopupMenu menu = new JPopupMenu("Menu");
menu.add("A");
menu.add("B");
menu.add("C");
//Open menu on button-click
button.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
menu.show(button,button.getWidth()/2,button.getHeight()/2);
}
});
//Close menu on CTRL+X
frame.addKeyListener(new KeyListener(){
@Override
public void keyPressed(KeyEvent e) {
//See https://docs.oracle.com/javase/8/docs/api/javax/swing/JPopupMenu.html#setVisible-boolean-
//See https://docs.oracle.com/javase/8/docs/api/javax/swing/JPopupMenu.html#isVisible--
if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_X && menu.isVisible()) {
menu.setVisible(false);
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
});
//Putting everything together
panel.add(button);
frame.add(panel);
frame.setSize(300,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
这不起作用,因为密钥侦听器已添加到JFrame。当按下按钮并打开菜单时,菜单会获得焦点,因此按键侦听器无法正常工作。
可以通过在代码中添加以下几行来解决此问题:
//this is doing the trick
button.setFocusable(false);
menu.setFocusable(false);
如果您不想执行此操作,而只想将KeyListener添加到JPopupMenu,则可以执行以下操作:
//Open menu on button-click
button.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
menu.show(button,button.getHeight()/2);
menu.requestFocus();
}
});
//Close menu on CTRL+X
menu.addKeyListener(new KeyListener(){
@Override
public void keyPressed(KeyEvent e) {
//See https://docs.oracle.com/javase/8/docs/api/javax/swing/JPopupMenu.html#setVisible-boolean-
//See https://docs.oracle.com/javase/8/docs/api/javax/swing/JPopupMenu.html#isVisible--
if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_X && menu.isVisible()) {
menu.setVisible(false);
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
});
这里的窍门是在菜单打开时将焦点设置在菜单上(在按钮的动作侦听器中):
menu.requestFocus();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。