为啥字符串对象不显示被附加到它的按键字符?

Posted

技术标签:

【中文标题】为啥字符串对象不显示被附加到它的按键字符?【英文标题】:Why doesn't the String object display that gets pressed key characters appended to it?为什么字符串对象不显示被附加到它的按键字符? 【发布时间】:2016-04-21 00:44:22 【问题描述】:

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

下面是我的代码。请查看它以供参考并帮助我找到最好的方法。谢谢。

/* 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

【问题讨论】:

沙盒?我可以想象有人在网站中恶意使用 keypress() 真的可以编译吗? Graphics.drawString() 方法接受 StringAttributedCharacterIterator 但不接受 StringBuffer... @Thomas Klager 嗨。对不起,我在这里输入代码时犯了一个错误。我实际上试图通过 drawString() 显示 String.valueOf(s) (我已经编辑了代码),但我仍然没有看到输出。那么,是否可以显示来自paint() 以外的方法的字符串?我用谷歌搜索了很多,但没有发现任何东西。 @Leo 什么是沙盒?抱歉,我是 Java 初学者,没听懂你说的。 docs.oracle.com/javase/tutorial/deployment/applet/security.html 【参考方案1】:

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

将你的方法keyPressed更改为

   @Override
    public void keyPressed(KeyEvent K) 
       /* .. many lines omitted .. */
       showStatus("Typed : "+s);
       repaint(); // <<- this line is missing!
    

作为解释:EDT 是运行您的小程序的线程。它从事件队列中获取事件并将它们分派给各种事件侦听器。它的职责之一是重新绘制您的组件(根据要求,因为有人/某事更改了组件)或在您的组件被遮盖并且现在再次显示之后。

【讨论】:

谢谢。在我添加 repaint(); 语句后,它运行良好。我理解它的需要。不过有一件事:你能告诉这个菜鸟这个“Swing thread”是什么吗?我在想它是否与javax.swing 包有关,但我没有在程序中导入它。 @ProgyadeepMoulik 感谢您的评论。我试图改进和澄清我的答案。 非常感谢先生 :)【参考方案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

【讨论】:

您好 Andrew,感谢您尝试帮助我,但我不是 Java 专业人士,所以您的代码超出了我的想象。不过,Thomas Klager 的回答很有帮助。但再次感谢:)

以上是关于为啥字符串对象不显示被附加到它的按键字符?的主要内容,如果未能解决你的问题,请参考以下文章

如果文件不存在,则创建它并将字符串写入其中。如果确实如此,则将字符串附加到它。工作不正常

为啥这个 Django 原始 SQL 查询不返回输出?

子类 UIView 不显示添加到它的 UIImageViews

为啥我的图片在附加到电子邮件时不显示?

为啥来自 xml Web 服务的字符串在 Android TextView 中不显示新行?

为啥我的 html 不显示从我的数据库中获取的特殊字符