我目前正在开发一个程序,它将一个介于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();
}
}
答案 0 :(得分:4)
如果没有完整的程序,很难确定,但看起来您正在从ChangeListener
读取和写入数据。
读取和写入操作块的时间不确定,在此期间Event Dispatch Thread (EDT)无法处理其他事件。阻止EDT将使您的GUI看起来被冻结。
尝试关闭另一个线程来处理读/写操作或使用SwingWorker来避免阻止EDT。
(使用Minimal, Complete, and Verifiable example更新您的帖子,我会尝试为您提供更具体的指导)