为什么我的java KeyListener不适用于我的ubuntu?
我正在用java测试我的keyListener 我的系统在Ubuntu 14.04中。我在main中设置了一个面板,并初始化了密钥侦听器。我还将focusable设置为true,并执行requestFocusInWindow 但当我运行程序时,println从未出现在控制台中。我对此感到困惑为什么我的java KeyListener不适用于我的ubuntu?,java,swing,keylistener,Java,Swing,Keylistener,我正在用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;
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的
- 将
添加到k
中,然后使其可见frame
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);
}
});
}
}
有什么建议吗
- 使用
KeyListener的
- 将
添加到k
中,然后使其可见frame
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);
}
});
}
}
因为您使用的是
KeyListener
,说真的,这东西太易变了,只需使用它就更简单了,它解决了焦点相关的问题,并提示更好的代码重用和抽象。我还希望Key
在某个点实际添加到框架中,并且框架变得可见这是一个常见问题,使用相同的解决方案,例如,嗨,我的框架出现了。但是你的意思是给我的第一个评论添加关键字,你也可以考虑提供一个演示你的问题的方法。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将减少混乱和更好的响应,因为您使用的是键盘监听器
,说真的,这东西太喜怒无常了,使用更简单,它解决了与焦点相关的问题,并提示更好的代码重用和抽象。我还希望Key
在某个点实际添加到框架中,并且框架变得可见。这是一个常见问题,使用相同的解决方案,例如,,,嗨,我的框架出现了。但是你的意思是给我的第一个评论添加关键字,你也可以考虑提供一个演示你的问题的方法。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将减少混乱和更好的响应