InputMap mapKeyInput;
ActionMap mapAction ;
HandlerKey hkLeft = new HandlerKey("LeftKey",KeyEvent.VK_LEFT);
HandlerKey hkRight = new HandlerKey("RightKey",KeyEvent.VK_RIGHT); private void setKeyMap(InputMap inputmap)
{
inputmap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0),"LeftKey");
inputmap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0),"RightKey");
inputmap.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,0),"PageUp");
inputmap.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,0),"PageDown");
inputmap.put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT,0),"Insert");
inputmap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0),"Delete");
}
private void initKeyMap()
{
mapKeyInput= getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
setKeyMap(mapKeyInput);
mapKeyInput = getInputMap(JComponent.WHEN_FOCUSED);
setKeyMap(mapKeyInput);
mapKeyInput = getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
setKeyMap(mapKeyInput);
mapAction = getActionMap();
mapAction.put("LeftKey",hkLeft);
mapAction.put("RightKey",hkRight);
mapAction.put("PageUp",hkPageUp);
mapAction.put("PageDown",hkPageDown);
mapAction.put("PageUp",hkInsert);
mapAction.put("PageDown",hkDelete);
} public void keyevent(int nkeycode)
{
int ncurtype;
switch(nkeycode)
{
case KeyEvent.VK_LEFT:
...
}}

解决方案 »

  1.   

    这应该不难呀????我不知道怎样使你的折线移动的具体代码.
    我想只要你判断了用户按下的是否是方向键就可以在相应的代码里实现了呀,跟一般的ActionListener事件差不多的.要不你把你的折线移动的代码帖出来,大家帮你改一下.
      

  2.   

    我用的是JBuilder,一共建了三个类分别是:
      ProcessLine它是一个applet;代码如下:
    package 过程线;import java.awt.*;import java.applet.Applet;
    import javax.swing.*;
    import java.awt.font.*;
    import java.awt.Graphics;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.*;public  class ProcessLine extends JApplet {
    public void init() {
        Object o = new Object();
        Container  contentPane =this.getContentPane();
        SketchPanel panel = new SketchPanel();
        contentPane.add(panel);
        KeyHandler listener = new KeyHandler();
        addKeyListener(listener);
      }}
    第二个类是:SketchPanel 它主要是实现过程线的表面。代码如下:(写的比较乱)package 过程线;
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;public class SketchPanel extends JPanel
    {
        public int[] xPoints;
        public int[] yPoints;  public SketchPanel()
      {
      }
      public void paint(Graphics g)
      {
        g.translate(100,100);//将坐标原点转换
        g.setColor(Color.black);
        g.drawLine(0,0,0,510);//画X坐标
        g.drawLine(0,510,800,510);//画Y坐标
       //画网格也就是刻度
        g.setColor(Color.lightGray);
        int x =0;
        int y =0;
        int x1=0;
        int y1 =0;   for (int i = 0; i <16; i++)
       {
          x = 0;
          y += 30;
          x1 = 800;
          y1 += 30;
          g.drawLine(x, y, x1, y1);
          g.drawLine(0,0,800,0);
       }   int x2 =0;
       int y2 =0;
       int x3 =0;
       int y3 = 510;   for (int j = 0; j < 16; j++)
       {
          x2 += 50;
          y2 = 0;
          x3 += 50;
          y3 = 510;
          g.drawLine(x2, y2, x3, y3);
       }    //画折线    xPoints = new int[50];
        int sun = -50;
        for (int i = 0; i < xPoints.length; i++)
        {
          if (xPoints[i]>= 0 && xPoints[i] <= 900)
          sun +=50;
          xPoints[i] += sun;
          //repaint();
        }    yPoints = new int[50];
        for (int k = 0; k < yPoints.length; k++)
        {
          yPoints[k] = (int) (Math.random()*500 );
          //repaint();
        }    //super.paint(g);
        g.setColor(Color.red);
        g.drawPolyline( xPoints, yPoints, xPoints.length);    //传递节点
        /*int xRect = -45;
        for(int i=0;i<50;i++){      xRect +=45;
        }
        int yRect = 0;
        for(int i=0;i<50;i++){
         yRect = (int)(Math.random()*495);
        }
        int width = 10;
        int height = 10;
        g.setColor(Color.green);
        g.fill3DRect(xRect,yRect,width,height,true);*/    //传递流量
        int flux = -5;
        int xString = -20;
        int yString =540;
        for(int i = 0;i<18;i++)
         {
          xString=-20;
          yString -= 30;
          flux += 5;
          String s =String.valueOf(flux);
          g.setColor(Color.black);
          Font f= new Font("宋体",Font.BOLD,14);
          g.setFont(f);
          g.drawString(s,xString,yString);
         }      //传递日期
          int month = 7;
          xString = -100;
          yString = 520;
        for(int i=0;i<=8;i++)
        {
          month = 7;
          xString += 100;
          yString = 520;
          g.setColor(Color.black);
          Font f= new Font("宋体",Font.BOLD,14);
          g.setFont(f);
          String s1=String.valueOf(month);
          g.drawString(s1,xString,yString);
        }
          int day =1;
          xString = -80;
          yString = 520;
        for(int i=0;i<=8;i++)
        {
          day += 1;
          xString +=100;
          yString = 520;
          g.setColor(Color.black);
          Font f= new Font("宋体",Font.BOLD,14);
          g.setFont(f);
          String s2 = String.valueOf(day);
          g.drawString(s2,xString,yString);
         }
          xString = -90;
          yString = 520;
        for(int i=0;i<=8;i++)
        {
          String s3 = "/";
          xString +=100;
          yString = 520;
          g.setColor(Color.black);
          Font f= new Font("宋体",Font.BOLD,14);
          g.setFont(f);
          g.drawString(s3,xString,yString);
         }
        }}
    第三个类是KeyHandler,我想在这个类实现键盘事件。也就是左右移动,放大,缩小折线,还有就是在左右移动,放大,缩小折线的同时,X轴的日期也改变,我把左移设为“A”键,右移设为“D”键,放大设为“W”键,缩小设为“S”键,请问怎么在这里实现键盘事件;代码如下:
    package 过程线;
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    import java.awt.event.KeyEvent; public class KeyHandler extends SketchPanel implements KeyListener{
       public void keyPressed(KeyEvent keyEvent) {   int keyCode = keyEvent.getKeyCode();
     } public void keyTyped(KeyEvent keyEvent) {
        char keyChar = keyEvent.getKeyChar();
     }
     public void keyReleased(KeyEvent keyEvent) {
      }}
      

  3.   

    没有在你的事件中调用repaint()方法。只要调用repaint()就行了。
      

  4.   

    是不是还要获得JPanel 的焦点,我在事件中调用过repaint()方法,可是我的键盘事件根本没有一点反应,哪位高手能在我的KeyHandler类中加入一些具体的代码,并做详细的说明吗?还有我的ProcessLine  Applet 中的init()方法中的代码是否有错误,小弟我急需正确和相对详细的代码,刚工作不久,开发经验不足,请多多指教,急!急!急!急!急!急!
      

  5.   

    to Onega:
         你好,你能告诉我你所向我推荐的键盘事件详细描述吗?例如一些注释什么的。Thank you .
      

  6.   

    here is a sample
    http://www.fruitfruit.com/vc/java/applet/AppletKeyExample.java