为什么不显示附加了按下的键字符的 String 对象?
Why doesn't the String object display that gets pressed key characters appended to it?
我使用按键事件处理编写了一个 Java 小程序代码来演示 Java 中的非缓冲输入。我的代码工作正常,输出正常,但我在这个程序中完成另一个 objective 时遇到了问题:在重写的 keyPressed() 方法中,我写了以下行: showStatus(s); ,其中 s 是全局静态 StringBuffer 对象,从键盘输入的字符附加到该对象。但是 showStatus() 方法在小程序查看器的状态栏上显示文本。因此,本程序只能在小程序查看器中使用,而不能在网络浏览器中使用。我试着把语句 g.drawString(String.valueOf(s),10,90); (g=Graphics class 对象作为 paint() 方法中 paint()) 的参数以显示 canvas 中的文本。我希望它能工作,因为 s 是全局的和静态的,但它没有显示任何输出。我在 paint() 中使用了 drawString() 方法,覆盖和不覆盖 boolean action() 方法,但我仍然没有得到任何东西。我只需要在小程序的 canvas 中显示键入的文本方面的帮助。
下面是我的代码。请查看它以供参考,并帮助我找到最好的方法。谢谢。
/* 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
问题是:EDT(事件调度线程)如何知道它应该 repaint
applet?
将您的方法 keyPressed
更改为
后有效
@Override
public void keyPressed(KeyEvent K) {
/* .. many lines omitted .. */
showStatus("Typed : "+s);
repaint(); // <<- this line is missing!
}
作为解释:EDT 是运行您的小程序的线程。它从事件队列中获取事件并将它们分派给各种事件侦听器。它的职责之一是重新绘制您的组件(根据要求,因为某人/某事更改了组件)或在您的组件被遮盖并现在再次显示之后。
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
我使用按键事件处理编写了一个 Java 小程序代码来演示 Java 中的非缓冲输入。我的代码工作正常,输出正常,但我在这个程序中完成另一个 objective 时遇到了问题:在重写的 keyPressed() 方法中,我写了以下行: showStatus(s); ,其中 s 是全局静态 StringBuffer 对象,从键盘输入的字符附加到该对象。但是 showStatus() 方法在小程序查看器的状态栏上显示文本。因此,本程序只能在小程序查看器中使用,而不能在网络浏览器中使用。我试着把语句 g.drawString(String.valueOf(s),10,90); (g=Graphics class 对象作为 paint() 方法中 paint()) 的参数以显示 canvas 中的文本。我希望它能工作,因为 s 是全局的和静态的,但它没有显示任何输出。我在 paint() 中使用了 drawString() 方法,覆盖和不覆盖 boolean action() 方法,但我仍然没有得到任何东西。我只需要在小程序的 canvas 中显示键入的文本方面的帮助。
下面是我的代码。请查看它以供参考,并帮助我找到最好的方法。谢谢。
/* 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
问题是:EDT(事件调度线程)如何知道它应该 repaint
applet?
将您的方法 keyPressed
更改为
@Override
public void keyPressed(KeyEvent K) {
/* .. many lines omitted .. */
showStatus("Typed : "+s);
repaint(); // <<- this line is missing!
}
作为解释:EDT 是运行您的小程序的线程。它从事件队列中获取事件并将它们分派给各种事件侦听器。它的职责之一是重新绘制您的组件(根据要求,因为某人/某事更改了组件)或在您的组件被遮盖并现在再次显示之后。
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