微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在按键

如何解决在按键

我正在创建一个工具,用于自动完成处理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 举报,一经查实,本站将立刻删除。