【问题标题】:JSlider freezes programJSlider 冻结程序
【发布时间】:2016-12-29 20:14:21
【问题描述】:

我目前正在开发一个程序,它将一个 100 到 355 之间的值发送到一个带有 Arduino 与 rgb LED 灯条连接的串行端口。

程序运行了一会儿,但突然卡住了,我无法移动任何滑块或单击任何按钮。

我认为这是由于程序处理了太多事件,因为如果我缓慢移动滑块,这个问题不会经常发生,但我不知道如何减少滑块激活的事件数量。

这是我的滑块代码:

redslide.addChangeListener(new ChangeListener() {
    public void stateChanged(ChangeEvent arg0) {
        try {
            output.flush();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        int brightness = redslide.getValue();
        String message = "r" + brightness;
        byte[] data = message.getBytes();
        try {
            output.write(data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
});

这是我的新代码:

redslide.addChangeListener(new ChangeListener() {
    public void stateChanged(ChangeEvent arg0) {
        int brightness = redslide.getValue();
        String message = "r" + brightness;
        byte[] data = message.getBytes();
        new Thread(() -> Write(data)).start();
    }
});

public static void Write(byte[] data){
        try {
            output.write(data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

【问题讨论】:

  • 发送数据可能不会导致冻结。应用程序是否也在 Swing 事件线程上接收数据?
  • ................................你好??

标签: java swing communication


【解决方案1】:

如果没有完整的程序,很难确定,但您似乎正在从ChangeListener 读取和写入数据。

读写操作阻塞一段不确定的时间,在此期间Event Dispatch Thread (EDT) 无法处理其他事件。阻止 EDT 将使您的 GUI 看起来被冻结。

尝试关闭另一个线程来处理读/写操作或使用SwingWorker 以避免阻塞 EDT。

(使用Minimal, Complete, and Verifiable example 更新您的帖子,我会尽力为您提供一些更具体的指导)

【讨论】:

  • 我要补充:如果您需要确定您的代码是否在事件调度线程上运行,请调用 javax.swing.SwingUtilities.isEventDispatchThread。
猜你喜欢
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多