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!");
}
}
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事件又会没得。