为什么String对象显示没有附加按下的关键字符?

时间:2016-01-15 12:10:16

标签: java applet awt keylistener keyevent

我使用Key Event处理编写了一个Java applet代码来演示Java中的非缓冲输入。我的代码工作正常,输出正常,但我在此程序中无法实现另一个目标:在覆盖 keyPressed()方法中,我写了一行: showStatus( s); ,其中 s 是全局静态StringBuffer对象,其中附加了从键盘输入的字符。但 showStatus()方法在applet查看器的状态栏上显示文本。因此,本程序仅可在applet查看器中使用,而不能在Web浏览器中使用。我尝试将语句 g.drawString(String.valueOf(s),10,90); g = Graphics类对象作为paint()的参数) paint()方法中显示画布中的文本。我希望这可以工作,因为它是全局的和静态的,但它没有显示任何输出。我在 paint()中使用了 drawString()方法,无论是否覆盖布尔动作()方法,但我仍然没有'得到任何东西。我只想帮助在applet的画布中显示键入的文本。

以下是我的代码。请查看它以供参考,并尽可能地帮助我。谢谢。

/* An applet that implements the concept of non buffered user input
using Event handling method.
*/

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class NonBufferInput extends Applet implements KeyListener {
    public static StringBuffer s;

    @Override
    public void init() {
        addKeyListener(this);
        s=new StringBuffer();
    }//init

    @Override
    public void keyTyped(KeyEvent K) {}

    @Override
    public void keyPressed(KeyEvent K) {
       char c=K.getKeyChar();
       int i=K.getKeyCode();
       if(i==32)  //space bar
           s.append(' ');
       else if(i==10||i==16||i==20||i==32||i==17||i==524||i==18||i==525||i==27
             ||(i>=112&&i<=123)||i==145||i==19||i==155||i==36||i==33||i==127
             ||i==35||i==34||i==144||(i>=37&&i<=40));  //characters I don't want as input
       else if(i==8) {  //backspace
           if(s.length()!=1)
               s.setLength(s.length()-1);
       }
       else
           s.append(c);
       showStatus("Typed : "+s);
    }

    @Override
    public void keyReleased(KeyEvent K) {}

    @Override
    public void paint(Graphics g) {
        g.drawString("Text will be displayed on status bar as you type.",10,50);
        g.setColor(Color.blue);
        g.drawString(String.valueOf(s),10,80); //PROBLEM
    }//paint

    @Override
    public boolean action(Event event, Object obj) {
        repaint();
        return true;
    }//action
}//class

2 个答案:

答案 0 :(得分:2)

addKeyListener(this);

最好是:

setFocusable(true); // Sets the focusable state of this Component to the specified value.
addKeyListener(this);

然后添加:

@Override
public void start() {
    requestFocusInWindow(); // Requests that this Component get the input focus ..
}//start

答案 1 :(得分:1)

问题是:EDT(事件调度线程)如何知道它应该repaint小程序?

将方法keyPressed更改为

后,它可以正常工作
   @Override
    public void keyPressed(KeyEvent K) {
       /* .. many lines omitted .. */
       showStatus("Typed : "+s);
       repaint(); // <<- this line is missing!
    }

作为解释:EDT是运行applet的线程。它从事件队列中获取事件并将它们分派给各种事件侦听器。其责任之一是重新绘制组件(根据要求,因为某人/某事改变了组件)或组件被遮挡后再重新显示。