java中是否有一个与动作侦听器相反的接口,以便在动作不为';怎么回事?

java中是否有一个与动作侦听器相反的接口,以便在动作不为';怎么回事?,java,Java,我使用eclipse用java制作了一个基本的聊天应用程序。我现在开始给它添加额外的功能,目前我还停留在一个功能上,该功能可以告诉用户其他人何时在打字,类似于whatsapp和facebook messenger 目前,我有一个整数记录用户是否正在键入 public int typing = 0; 当值为0时,用户没有键入值,而值为1时,用户没有键入值(布尔值由于某些原因不起作用) 我在文本框上有一个操作侦听器,用于侦听插入符号更新并执行以下代码: isTyping = 1; String t

我使用eclipse用java制作了一个基本的聊天应用程序。我现在开始给它添加额外的功能,目前我还停留在一个功能上,该功能可以告诉用户其他人何时在打字,类似于whatsapp和facebook messenger

目前,我有一个整数记录用户是否正在键入

public int typing = 0;
当值为0时,用户没有键入值,而值为1时,用户没有键入值(布尔值由于某些原因不起作用)

我在文本框上有一个操作侦听器,用于侦听插入符号更新并执行以下代码:

isTyping = 1;
String typing = ("t-");
client.send(typing.getBytes());
isTyping = 0;
String typing = ("n-");
client.send(typing.getBytes());
然后,服务器将此消息转发给其他客户端,当他们收到此消息时,如果他们没有键入,则会显示“正在键入某人”标签

我想要的是当插入符号没有更新以执行此代码时要侦听的内容:

isTyping = 1;
String typing = ("t-");
client.send(typing.getBytes());
isTyping = 0;
String typing = ("n-");
client.send(typing.getBytes());

这是可能的,还是有一种方法可以使这项工作正常进行,因为我似乎需要监听无克拉更新?

在操作未发生时执行命令实际上是不可能的,因为它不能回答一个关键问题—应该多久执行一次?“始终”并不是一个真正的答案——这将需要一个不断执行的无限循环,这将限制整个应用程序

也就是说,您可以设置一个定时延迟来发送该用户已停止编辑的通知。在我看来,只要按下一个键,它就会倒计时(通过线程睡眠)到0,并刷新到一个设定值(正),但也可能是相反的(正如AJ在评论中所建议的)


在动作未发生时执行命令实际上是不可能的,因为它不能回答一个关键问题——应该多久执行一次?“始终”并不是一个真正的答案——这将需要一个不断执行的无限循环,这将限制整个应用程序

也就是说,您可以设置一个定时延迟来发送该用户已停止编辑的通知。在我看来,只要按下一个键,它就会倒计时(通过线程睡眠)到0,并刷新到一个设定值(正),但也可能是相反的(正如AJ在评论中所建议的)


我建议避开侦听器并创建一个线程:


创建的线程检查textbox的值,并在循环中记住textbox的当前值。如果自上次检查以来该值没有更改,则表示用户没有键入。考虑到检查的频率,可能只有一个长度的值可以用于检查。

< P>我建议避免监听器并创建线程:


创建的线程检查textbox的值,并在循环中记住textbox的当前值。如果自上次检查以来该值没有更改,则表示用户没有键入。考虑到检查的频率,可能只有一个值的长度可以用于检查。

使一个“到期”计时器等待一个很短的延迟,然后执行您的“不打字”动作。每当文本字段的文档发生更改时,请重新启动计时器,以确保它仅在用户键入过程中出现停顿时执行:

JTextField textField = /* ... */;

ActionListener idleSender = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent event) {
        isTyping = false;
        client.send("n-".getBytes(StandardCharsets.UTF_8));
    }
};

int delay = 2000;  // 2 seconds
final Timer sendTimer = new Timer(delay, idleSender);
sendTimer.setRepeats(false);
sendTimer.start();

textField.getDocument().addDocumentListener(new DocumentListener() {
    @Override
    public void insertUpdate(DocumentEvent event) {
        sendTimer.restart();
    }

    @Override
    public void removeUpdate(DocumentEvent event) {
        sendTimer.restart();
    }

    @Override
    public void changedUpdate(DocumentEvent event) {
        sendTimer.restart();
    }
});
一些注意事项:

  • 使用javax.swing.Timer而不是java.util.Timer很重要。后者使用自己的线程,而前者总是在AWT事件调度线程上执行其任务。在EDT以外的任何线程上调用(几乎)任何AWT或Swing方法都是不允许的,尽管违反该规则可能不会生成异常,但事情往往会间歇性地、不可预测地中断
  • 使用
    键入.getBytes()
    而不将字符集传递给getBytes(),可能会导致另一端的数据损坏。它将使用基础系统的默认字符集转换字节,该字符集可能与服务器的默认字符集不同。最好使用
    “n-”.getBytes(StandardCharsets.UTF_8)
  • 我不知道“布尔函数由于某种原因不起作用”实际上是什么意思,但布尔函数在任何情况下都能完美地工作。如果您遇到了问题,您将通过找出问题所在并加以解决来为自己提供服务,而不是编写特殊的代码来回避问题,几个月后又会回来问为什么要使用0和1来代替false和true

制作一个“过期”计时器,等待一个短暂的延迟,然后执行“不键入”操作。每当文本字段的文档发生更改时,请重新启动计时器,以确保它仅在用户键入过程中出现停顿时执行:

JTextField textField = /* ... */;

ActionListener idleSender = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent event) {
        isTyping = false;
        client.send("n-".getBytes(StandardCharsets.UTF_8));
    }
};

int delay = 2000;  // 2 seconds
final Timer sendTimer = new Timer(delay, idleSender);
sendTimer.setRepeats(false);
sendTimer.start();

textField.getDocument().addDocumentListener(new DocumentListener() {
    @Override
    public void insertUpdate(DocumentEvent event) {
        sendTimer.restart();
    }

    @Override
    public void removeUpdate(DocumentEvent event) {
        sendTimer.restart();
    }

    @Override
    public void changedUpdate(DocumentEvent event) {
        sendTimer.restart();
    }
});
一些注意事项:

  • 使用javax.swing.Timer而不是java.util.Timer很重要。后者使用自己的线程,而前者总是在AWT事件调度线程上执行其任务。在EDT以外的任何线程上调用(几乎)任何AWT或Swing方法都是不允许的,尽管违反该规则可能不会生成异常,但事情往往会间歇性地、不可预测地中断
  • 使用
    键入.getBytes()
    而不将字符集传递给getBytes(),可能会导致另一端的数据损坏。它将使用基础系统的默认字符集转换字节,该字符集可能与服务器的默认字符集不同。最好使用
    “n-”.getBytes(StandardCharsets.UTF_8)
  • 我不知道“布尔函数由于某种原因不起作用”实际上是什么意思,但布尔函数在任何情况下都能完美地工作。如果您遇到了问题,您将通过找出问题所在并加以解决来为自己提供服务,而不是编写特殊的代码来回避问题,几个月后又会回来问为什么要使用0和1来代替false和true

做一些事情,然后在触发事件时,不要做那些事情。运行一个定期计时器,w