我的JFrame监听不到.请大家帮帮忙.
谢谢.
谢谢.
解决方案 »
- ThreadPoolExecutor.CallerRunsPolicy()相关问题问题
- java快速排序算法的代码理解...
- Jtable如何快速更新大量数据
- 请教一个String数组排序的问题?
- 恳请各位帮我看看下面代码为什么可以编译通过?我认为应该是编译通不过的啊,万分感谢
- 可以指定在局域网的机器上生成文件吗?
- 我的jb6启动时为何跟JB3不同,会多一个DOS黑窗体?
- 为什么import other.*;不包括import other.oth;????????
- 我想得到一个目录下所有的子目录的大小,并排序。然后输出到txt文本中保存
- 如何在编译完成后将jb6生成的jar文件输出到weblogic下的指定目录?应如何配置jb6?
- 散分--刚收到金碟的Offer,想知道金碟里面如何,能不能进去?
- 怎样使用google 提供的翻译API?
public void addKeyListener(KeyListener l)添加指定的按键侦听器,接收此组件发出的按键事件。如果 l 为 null,则不会抛出异常并且不执行操作。
import java.awt.event.*;
class Test2 extends Frame
{
public Test2()
{
this.addKeyListener(new MyKeyAdapter());
}
private class MyKeyAdapter extends KeyAdapter
{
public void keyTyped(KeyEvent e)
{
System.out.println("Pressed");
}
}
public static void main(String []args)
{
Test2 t=new Test2();
t.setSize(500,500);
t.show();
}
}这个是Frame类,JFrame是Frame的子类,当然也可以接收键盘事件.
那有什么办法给JFrame添加上键盘事件呢?
可能开始没把问题说清楚.我在JFrame里加入JDesktopPane用来加载内部窗口,我发现JFrame一得到焦点马上就会失去.不清楚是不是这个原因,所以才监听不到键盘事件.
是否能用一个守护线程来监听呢.还是有更好的方法.
import java.awt.event.*;
import javax.swing.*; class keytest extends JFrame{
public keytest(){
mypanel f=new mypanel();
getContentPane().add(f);
setSize(300,300);
show();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String a[]){
new keytest();
}
}
class mypanel extends JPanel{
mypanel(){
setFocusable(true);//加了一句;
addKeyListener(new KeyAdapter(){
public void keyTyped(KeyEvent e){
char c=e.getKeyChar();
if(c=='o') System.out.print("o is pressed");
}
});
}
}
给你一个例子...........,......................
我把问题说一次;
我在JFrame里加入JDesktopPane用来加载JInternalFrame,我已经设了setFocusable(true),所以JFrame才会一得到焦点马上就会失去.因为一打开一个JInternalFrame,JFrame的焦点就会被刚打开的JInternalFrame夺走,所以JFrame就无法监听到键盘事件.
作用是做一个全局的键盘事件监听,不管你正打开哪个JInternalFrame或JDialog.
想不到一个好的方法...
--难道不可以对你要获取事件的那个JFrame再setFocusable(true)吗?
你的意思是说让JFrame每次触发键盘之前先setFocusable(true).但是你当前正前操作一个JInternalFrame,焦点已经在当前的JInternalFrame上.除非你的JInternalFrame也有键盘事件监听,通过当前的JInternalFrame键盘事件来触发JFrame的键盘事件.这样是肯定走得通的,如果存在有500个JInternalFrame,必需每个都得添加监听程序,太麻烦了.
http://life.fzylw.com/info/info.php?id=1186
private JTable myTable;
//按键操作,包括单键和多键操作
private int iStrokeCount = 0;
private String[] keyStrokePath = new String[1024];
KeyStroke keyStroke[] = new KeyStroke[1024];
public KeyCodeAdapter(KeyCodeMap pm_keyCodeMap,JTable pm_jTable)
{
this.keyCodeMap = pm_keyCodeMap;
this.myTable = pm_jTable;
}
/**
* register Action to the JTable
*/
public void registerAction()
{
LinkedList keyCodeList = (LinkedList)keyCodeMap.getKeyCodeMapList();
for(int i=0;i<keyCodeList.size();i++)
{
LinkedList rowKeyCodeList = (LinkedList)keyCodeList.get(i);
{
int iType = Integer.parseInt(String.valueOf(rowKeyCodeList.get(1)));
LinkedList keyList = (LinkedList)rowKeyCodeList.get(2);
int iModifi=0,iKeyCode=0;
for(int j=0;j<keyList.size()-1;j++)
{
iModifi = iModifi+Integer.parseInt(String.valueOf(keyList.get(j)));
}
iKeyCode = Integer.parseInt(String.valueOf(keyList.get(keyList.size()-1)));
//add new KeyStroke
//单键操作
if(iModifi == 0)
{
keyStroke[iStrokeCount] = KeyStroke.getKeyStroke((char)iKeyCode);
}
//多键操作
else
{
keyStroke[iStrokeCount] = KeyStroke.getKeyStroke(iKeyCode,iModifi,false);
}
this.myTable.registerKeyboardAction(this,"iStroke"+(iStrokeCount),keyStroke[iStrokeCount],JComponent.WHEN_FOCUSED);
keyStrokePath[iStrokeCount]=String.valueOf(rowKeyCodeList.get(0));
iStrokeCount++;
}
}
}
/**
* cancel the ActionListener
*/
public void removeAction()
{
this.myTable.resetKeyboardActions();
this.iStrokeCount = 0;
this.keyStrokePath = new String[1024];
this.keyStroke = new KeyStroke[1024];
}这是给JTable注册KeyStroke的例子,供楼主参考吧