簡體   English   中英

Java鍵綁定無效

[英]Java Key Bindings Not Working

我正在嘗試在JPanel上的Java中進行鍵綁定。 我希望在按下“ w”按鈕時執行某些操作。 我遵循Java教程進行綁定,但是actionPerformed方法不執行(即,沒有打印出文本)。 以下是我的測試GUI的全部代碼,並突出顯示了相關部分:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

@SuppressWarnings("serial")
public class Test extends JFrame{

private JPanel panel;

public Test(){
    super();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(500,500);
    setLayout(new BorderLayout());
    setVisible(true);        
    panel = new JPanel();

    // HERE ARE THE KEY BINDINGS
    panel.getInputMap().put(KeyStroke.getKeyStroke('w'),"forward");
    panel.getActionMap().put("forward", new AbstractAction(){
        @Override
        public void actionPerformed(ActionEvent e){
            System.out.println("test");
        }
    });
    // END OF KEY BINDINGS

    add(panel, BorderLayout.CENTER);
}

public static void main(String[] args){
    new Test();     
}

}

永遠不會打印文本“ test”。 我已經嘗試了很多次,使用了許多不同的變體,不同的鍵,並且確保面板聚焦,但沒有運氣。 我究竟做錯了什么?

問題是您查找KeyStroke KeyStroke.getKeyStroke('w')將返回typed w ,由於某種原因,它不會觸發鍵事件。 這就是為什么我傾向於避免這種方法的原因。 改為使用

panel.getInputMap().put(KeyStroke.getKeyStroke("W"),"forward");

要么

panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0),"forward");

另外,您可能想為InputMap定義焦點約束,類似

panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)...

會更安全...但是您將需要確定要從哪個級別觸發擊鍵

有關更多詳細信息,請參見JComponent如何使用鍵綁定

更新了示例

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test extends JFrame {

    private JPanel panel;

    public Test() {
        super();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 500);
        setLayout(new BorderLayout());
        setVisible(true);
        panel = new JPanel();

        // HERE ARE THE KEY BINDINGS
        panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "forward");
        panel.getActionMap().put("forward", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("test");
            }
        });
        // END OF KEY BINDINGS

        add(panel, BorderLayout.CENTER);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                new Test();
            }
        });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM