不要用keyListener,改用InputMap
下面的例子可以接受pageup,pagedown,left,right key
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;class SketchPanel extends JPanel
implements KeyListener
{
InputMap mapaEntrada;
ActionMap mapaAction ;
HandlerKey hkLeft = new HandlerKey("LeftKey",KeyEvent.VK_LEFT);
HandlerKey hkRight = new HandlerKey("RightKey",KeyEvent.VK_RIGHT);
HandlerKey hkPageUp = new HandlerKey("PageUp",KeyEvent.VK_PAGE_UP);
HandlerKey hkPageDown = new HandlerKey("PageDown",KeyEvent.VK_PAGE_DOWN);
public SketchPanel()
{ addKeyListener(this);
mapaEntrada= getInputMap(WHEN_IN_FOCUSED_WINDOW);
mapaAction = getActionMap();
mapaEntrada.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0),"LeftKey");
mapaEntrada.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0),"RightKey");
mapaEntrada.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,0),"PageUp");
mapaEntrada.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,0),"PageDown");
mapaAction.put("LeftKey",hkLeft);
mapaAction.put("RightKey",hkRight);
mapaAction.put("PageUp",hkPageUp);
mapaAction.put("PageDown",hkPageDown);
} public void keyPressed(KeyEvent evt)
{ int keyCode = evt.getKeyCode();
int d;
if (evt.isShiftDown())
d = 5;
else
d = 1;
if (keyCode == KeyEvent.VK_LEFT) add(-d, 0);
else if (keyCode == KeyEvent.VK_RIGHT) add(d, 0);
else if (keyCode == KeyEvent.VK_UP) add(0, -d);
else if (keyCode == KeyEvent.VK_DOWN) add(0, d);
} public void keyReleased(KeyEvent evt)
{} public void keyTyped(KeyEvent evt)
{ char keyChar = evt.getKeyChar();
int d;
if (Character.isUpperCase(keyChar))
{ d = 5;
keyChar = Character.toLowerCase(keyChar);
}
else
d = 1;
if (keyChar == 'h') add(-d, 0);
else if (keyChar == 'l') add(d, 0);
else if (keyChar == 'k') add(0, -d);
else if (keyChar == 'j') add(0, d);
} public boolean isFocusTraversable() { return true; } public void add(int dx, int dy)
{ end.x += dx;
end.y += dy;
Graphics g = getGraphics();
g.drawLine(start.x, start.y, end.x, end.y);
g.dispose();
start.x = end.x;
start.y = end.y;
} private Point start = new Point(50, 50);
private Point end = new Point(50, 50);
}public class Sketch extends JApplet
{ public void init()
{
Container contentPane = getContentPane();
contentPane.add(new SketchPanel());
}
}
class HandlerKey extends AbstractAction
{//LEFT,RIGHT,PAGEUP,PAGE DOWN will travel the images
int nKeyCode=0;
public HandlerKey(String s)
{
super(s);
}
public HandlerKey(String s,int keycode)
{
super(s);
nKeyCode=keycode;
}
public void actionPerformed(ActionEvent e)
{System.out.println(nKeyCode);
if(nKeyCode==KeyEvent.VK_LEFT)
{ return;
}
if(nKeyCode==KeyEvent.VK_RIGHT)
{ return;
}
if(nKeyCode==KeyEvent.VK_PAGE_DOWN)
{
return;
}
if(nKeyCode==KeyEvent.VK_PAGE_UP)
{
return;
}
}
}//end of HandlerKey
下面的例子可以接受pageup,pagedown,left,right key
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;class SketchPanel extends JPanel
implements KeyListener
{
InputMap mapaEntrada;
ActionMap mapaAction ;
HandlerKey hkLeft = new HandlerKey("LeftKey",KeyEvent.VK_LEFT);
HandlerKey hkRight = new HandlerKey("RightKey",KeyEvent.VK_RIGHT);
HandlerKey hkPageUp = new HandlerKey("PageUp",KeyEvent.VK_PAGE_UP);
HandlerKey hkPageDown = new HandlerKey("PageDown",KeyEvent.VK_PAGE_DOWN);
public SketchPanel()
{ addKeyListener(this);
mapaEntrada= getInputMap(WHEN_IN_FOCUSED_WINDOW);
mapaAction = getActionMap();
mapaEntrada.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0),"LeftKey");
mapaEntrada.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0),"RightKey");
mapaEntrada.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,0),"PageUp");
mapaEntrada.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,0),"PageDown");
mapaAction.put("LeftKey",hkLeft);
mapaAction.put("RightKey",hkRight);
mapaAction.put("PageUp",hkPageUp);
mapaAction.put("PageDown",hkPageDown);
} public void keyPressed(KeyEvent evt)
{ int keyCode = evt.getKeyCode();
int d;
if (evt.isShiftDown())
d = 5;
else
d = 1;
if (keyCode == KeyEvent.VK_LEFT) add(-d, 0);
else if (keyCode == KeyEvent.VK_RIGHT) add(d, 0);
else if (keyCode == KeyEvent.VK_UP) add(0, -d);
else if (keyCode == KeyEvent.VK_DOWN) add(0, d);
} public void keyReleased(KeyEvent evt)
{} public void keyTyped(KeyEvent evt)
{ char keyChar = evt.getKeyChar();
int d;
if (Character.isUpperCase(keyChar))
{ d = 5;
keyChar = Character.toLowerCase(keyChar);
}
else
d = 1;
if (keyChar == 'h') add(-d, 0);
else if (keyChar == 'l') add(d, 0);
else if (keyChar == 'k') add(0, -d);
else if (keyChar == 'j') add(0, d);
} public boolean isFocusTraversable() { return true; } public void add(int dx, int dy)
{ end.x += dx;
end.y += dy;
Graphics g = getGraphics();
g.drawLine(start.x, start.y, end.x, end.y);
g.dispose();
start.x = end.x;
start.y = end.y;
} private Point start = new Point(50, 50);
private Point end = new Point(50, 50);
}public class Sketch extends JApplet
{ public void init()
{
Container contentPane = getContentPane();
contentPane.add(new SketchPanel());
}
}
class HandlerKey extends AbstractAction
{//LEFT,RIGHT,PAGEUP,PAGE DOWN will travel the images
int nKeyCode=0;
public HandlerKey(String s)
{
super(s);
}
public HandlerKey(String s,int keycode)
{
super(s);
nKeyCode=keycode;
}
public void actionPerformed(ActionEvent e)
{System.out.println(nKeyCode);
if(nKeyCode==KeyEvent.VK_LEFT)
{ return;
}
if(nKeyCode==KeyEvent.VK_RIGHT)
{ return;
}
if(nKeyCode==KeyEvent.VK_PAGE_DOWN)
{
return;
}
if(nKeyCode==KeyEvent.VK_PAGE_UP)
{
return;
}
}
}//end of HandlerKey
成功编译了你的代码并配上了html文件,但用ie浏览仍然按键pageup,pagedown,left,right key
无效,是不是还要做什么设置?
public class Sketch extends JApplet
{ public void init()
{
Container contentPane = getContentPane();
contentPane.add(new SketchPanel());
FocusManager.getCurrentManager().focusNextComponent(contentPane);
}
}
就是缺少了语句FocusManager.getCurrentManager().focusNextComponent(contentPane);
能简单解释一下吗?
我学java看的是JAVA2核心技术卷I和卷II,但都这2本书中都未提及.请问你是在哪里看到的?
另外把keyListener,改用为InputMap,有什么好处吗?