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!");
}
}
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!");
}
}
解决方案 »
- 2级级联菜单!
- 关于Java的使用
- imgTemp = Toolkit.getDefaultToolkit().getImage("ship.jpg"); 已经挂在心里很久了,还是不懂,高手请.
- [求教]如何用sun.net包实现FTP获取服务端目录文件列表功能
- 查找字符出现次数??
- 怎么填加弹出菜单的下级菜单啊?比如新建菜单,下面有新建文件,新建快截方式:
- 在线等待,马上结贴
- 修改和添加数据的奇怪错误(能帮我解决问题我就送他200分,从没失言过)?????
- JTextArea里的字符怎样设置颜色?
- 有一个小问题,要想在jdk下用到javax怎么办?到哪找javax来呢,不是从visual age吧?
- interface.class
- 非贪婪匹配原理?
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!");
}
}
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!");
}
}
但我下面这样可以用。把按钮的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);
}
});
zhang5059的做法,你按tab键把焦点移到按钮上,key事件又会没得。