JSlider冻结程序

时间:2016-12-29 20:14:21

标签: java swing communication

我目前正在开发一个程序,它将一个介于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();
        }
    }

1 个答案:

答案 0 :(得分:4)

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

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

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

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

相关问题