为什么添加了按钮后,JFrame的按键监听不起作用了?

blackkettle 2012-08-27 03:56:17
Java 达人,

我写了一个 java 程序,一个面板上有两个按钮,同时监听用户的按键操作。

不添加按钮,按键操作的监听正常;添加按钮后,按键操作的监听就失效了。

请达人指点迷津。十分感谢!

代码如下:

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class Demo20 extends JFrame implements KeyListener{

private static final long serialVersionUID = 1L;

public Demo20(){
this.setTitle("键盘事件处理");
this.setSize(300, 200);
this.setLocationRelativeTo(this);// 窗口居中
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 窗口关闭动作处理
this.addKeyListener(this);// 添加注册键盘事件监听器
this.setLayout(new FlowLayout(FlowLayout.LEFT,45,45));

JButton buttonPop = new JButton("Pop out");
this.add(buttonPop);

buttonPop.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {
System.out.println("Pop up!");
}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}
});

JButton buttonPrint = new JButton("Print");
this.add(buttonPrint);

buttonPrint.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {
System.out.println("Print!");
}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}
});
}

@Override
public void keyPressed(KeyEvent arg0){// 敲击
}

@Override
public void keyReleased(KeyEvent arg0) {// 按下
if (arg0.getKeyCode() == 114) {// 114 F3对应的编码
Demo10.print();
}

if (arg0.getKeyCode() == 80) {// 80 P 对应的编码
System.out.println("Key P is pressed!");
}
}

@Override
public void keyTyped(KeyEvent arg0) {// 释放
}

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

public static void print() {
System.out.println("Running!");
}
}
...全文
938 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
blackkettle 2012-09-06
  • 打赏
  • 举报
回复
scbb,

好厉害!!!

我再改一下。

非常感谢!
scbb 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

zhang5059,

你太强了。

多谢!
[/Quote]

zhang5059的做法,你按tab键把焦点移到按钮上,key事件又会没得。
scbb 2012-08-28
  • 打赏
  • 举报
回复
楼主不知道标准是这么做的。
但我下面这样可以用。

把按钮的key事件传给他parent也就是你的JFrame。
(我只写了1个按钮的,另一个按钮同样。)

buttonPop.addKeyListener(new KeyListener() {
@Override
public void keyPressed(KeyEvent arg0) {
Demo20.this.keyPressed(arg0);
}
@Override
public void keyReleased(KeyEvent arg0) {
Demo20.this.keyReleased(arg0);
}
@Override
public void keyTyped(KeyEvent arg0) {
Demo20.this.keyTyped(arg0);
}
});

blackkettle 2012-08-28
  • 打赏
  • 举报
回复
zhang5059,

你太强了。

多谢!
孤雨 2012-08-28
  • 打赏
  • 举报
回复
重新获取焦点
书断华 2012-08-27
  • 打赏
  • 举报
回复
加上注释
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class Demo20 extends JFrame implements KeyListener{

private static final long serialVersionUID = 1L;

public Demo20(){
this.setTitle("键盘事件处理");
this.setSize(300, 200);
this.setLocationRelativeTo(this);// 窗口居中
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 窗口关闭动作处理
this.addKeyListener(this);// 添加注册键盘事件监听器
this.setLayout(new FlowLayout(FlowLayout.LEFT,45,45));

JButton buttonPop = new JButton("Pop out");
this.add(buttonPop);

buttonPop.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {
System.out.println("Pop up!");
Demo20.this.requestFocus();//点击按钮后获取焦点
}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}
});

JButton buttonPrint = new JButton("Print");
this.add(buttonPrint);

buttonPrint.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {
System.out.println("Print!");
Demo20.this.requestFocus();//点击按钮后获取焦点
}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}
});
this.requestFocus();//创建完后先获取焦点。
}

@Override
public void keyPressed(KeyEvent arg0){// 敲击
}

@Override
public void keyReleased(KeyEvent arg0) {// 按下
if (arg0.getKeyCode() == 114) {// 114 F3对应的编码
// Demo10.print();
}

if (arg0.getKeyCode() == 80) {// 80 P 对应的编码
System.out.println("Key P is pressed!");
}
}

@Override
public void keyTyped(KeyEvent arg0) {// 释放
}

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

public static void print() {
System.out.println("Running!");
}
}

书断华 2012-08-27
  • 打赏
  • 举报
回复
当添加按钮以后 JFrame 就会丢失焦点所以我们要从新获取焦点。
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class Demo20 extends JFrame implements KeyListener{

private static final long serialVersionUID = 1L;

public Demo20(){
this.setTitle("键盘事件处理");
this.setSize(300, 200);
this.setLocationRelativeTo(this);// 窗口居中
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 窗口关闭动作处理
this.addKeyListener(this);// 添加注册键盘事件监听器
this.setLayout(new FlowLayout(FlowLayout.LEFT,45,45));

JButton buttonPop = new JButton("Pop out");
this.add(buttonPop);

buttonPop.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {
System.out.println("Pop up!");
Demo20.this.requestFocus();
}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}
});

JButton buttonPrint = new JButton("Print");
this.add(buttonPrint);

buttonPrint.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {
System.out.println("Print!");
Demo20.this.requestFocus();
}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}
});
this.requestFocus();
}

@Override
public void keyPressed(KeyEvent arg0){// 敲击
}

@Override
public void keyReleased(KeyEvent arg0) {// 按下
if (arg0.getKeyCode() == 114) {// 114 F3对应的编码
// Demo10.print();
}

if (arg0.getKeyCode() == 80) {// 80 P 对应的编码
System.out.println("Key P is pressed!");
}
}

@Override
public void keyTyped(KeyEvent arg0) {// 释放
}

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

public static void print() {
System.out.println("Running!");
}
}

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧