【问题标题】:why my java KeyListener doesnt work for my ubuntu?为什么我的 java KeyListener 不适用于我的 ubuntu?
【发布时间】:2016-01-22 00:45:31
【问题描述】:

我正在 java 中测试我的 keyListener。

我在 Ubuntu 14.04 中的系统。我在 main 中设置了一个面板并初始化了关键侦听器。我还将 focusable 设置为 true 并执行 requestFocusInWindow。

但是当我运行程序时,println 永远不会出现在控制台中。对此感到困惑。

package key;

import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Key extends JPanel{
public void action(){
    KeyListener k = new KeyListener(){
        @Override
        public void keyPressed(KeyEvent k){
            System.out.println("key is pressed!");
        }
        @Override
        public void keyReleased(KeyEvent e){
            // TODO Auto-generated method stub
        }
        @Override
        public void keyTyped(KeyEvent e){
            System.out.println("key is typed!");
        }
    };
    this.addKeyListener(k);
    this.setFocusable(true);
    this.requestFocusInWindow();
}
public static void main(String[] args){
    JFrame frame = new JFrame();
    frame.setSize(400,300);
    JPanel panel = new JPanel();
    panel.setBackground(Color.BLUE);
    frame.add(panel);
    frame.setVisible(true);

    Key k = new Key();
    k.action();
}
}

【问题讨论】:

  • 因为你用的是KeyListener,说真的,那东西太喜怒无常了,用Key Bindings API更简单,它解决了焦点相关的问题,并提示更好的代码重用和抽象
  • 我也希望 Key 在某个时候实际上被添加到框架中并且框架可见
  • 这是一个常见问题,解决方法相同,对于example,exmaple,exmaple,example,example
  • 嗨,我的相框出现了。但是,将 Key 添加到框架是什么意思
  • 查看我的第一条评论,您也可以考虑提供runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个示例,它突出了您遇到的问题。这将导致更少的混乱和更好的响应

标签: java swing keylistener


【解决方案1】:

对此有何建议?

例如...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Key extends JPanel {

    public void action() {
        JLabel label = new JLabel("Waiting");
        InputMap inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW);
        ActionMap actionMap = getActionMap();

        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false), "press.a");
        actionMap.put("press.a", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText("Pressed A");
            }
        });
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, true), "release.a");
        actionMap.put("release.a", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText("Waiting");
            }
        });

        add(label);
    }

    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) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JPanel panel = new JPanel();
                panel.setBackground(Color.BLUE);
                frame.add(panel);
                Key k = new Key();
                k.action();
                frame.add(k, BorderLayout.SOUTH);
                frame.setSize(400, 300);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

【讨论】:

    猜你喜欢
    • 2013-07-27
    • 1970-01-01
    • 2017-09-06
    • 2015-02-02
    • 2016-12-07
    • 2015-12-16
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多