如何 "refresh" actionperformed 方法中的 JFrame?
How to "refresh" a JFrame inside an actionperformed method?
我尝试为我最近制作的神经网络设计一个 GUI。我正在使用 MNIST 数据集,并希望使用 JPanels 显示手写数字,并在其中写入亮度值。通过按下 "train" 按钮,网络得到训练并显示每个新数字。然而,这发生在按钮的 actionperformed 方法的 for 循环中,似乎我无法更改标签或文本的背景(至少它不显示更改)直到最后一个。我不知道我是否正确,但似乎只显示了最后一次更改。这就是为什么我的问题是是否可以 "refresh" actionperformed 方法中的 JFrame。
我已经尝试过 revalidate()、invalidate() 和 validate()、SwingUtilities.updateComponentTreeUI(frame),但是 none 成功了。
这是我的代码的相关部分:
train.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < iMax; i++) {
...
digitRefresh(reader.getInputs()[i], (int) reader.getInputs()[i][0], 0);
}
}
});
.
public void digitRefresh(double[] pixelValue, int target, int result) {
for (int i = 0; i < 784; i++) {
double value = pixelValue[i + 1];
int brightness = (int) (value * 255);
l_digit[i].setText(String.valueOf(value));
l_digit[i].setBackground(new Color(brightness, brightness, brightness));
}
l_target.setText(String.valueOf(target));
l_result.setText(String.valueOf(result));
this.revalidate();
}
谢谢你的每一个 awnser,抱歉我的英语不好。
最简单的做法是启动一个新线程。
@Override
public void actionPerformed(ActionEvent e) {
new Thread( ()->{
for (int i = 0; i < iMax; i++) {
...
final int fi = i;
EventQueue.invokeLater( ()->{
digitRefresh(reader.getInputs()[fi], (int) reader.getInputs()[fi][0], 0);
});
}).start();
}
现在所有的工作都在一个单独的线程上完成,然后当 ...
工作完成时,从 EDT 调用数字刷新方法。注意最后的 int fi 部分。关于在线程上来回切换有一些注意事项,因此最好研究比仅使用线程更好的控件。
例如摇摆工人:
How do I use SwingWorker in Java?
我尝试为我最近制作的神经网络设计一个 GUI。我正在使用 MNIST 数据集,并希望使用 JPanels 显示手写数字,并在其中写入亮度值。通过按下 "train" 按钮,网络得到训练并显示每个新数字。然而,这发生在按钮的 actionperformed 方法的 for 循环中,似乎我无法更改标签或文本的背景(至少它不显示更改)直到最后一个。我不知道我是否正确,但似乎只显示了最后一次更改。这就是为什么我的问题是是否可以 "refresh" actionperformed 方法中的 JFrame。
我已经尝试过 revalidate()、invalidate() 和 validate()、SwingUtilities.updateComponentTreeUI(frame),但是 none 成功了。
这是我的代码的相关部分:
train.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < iMax; i++) {
...
digitRefresh(reader.getInputs()[i], (int) reader.getInputs()[i][0], 0);
}
}
});
.
public void digitRefresh(double[] pixelValue, int target, int result) {
for (int i = 0; i < 784; i++) {
double value = pixelValue[i + 1];
int brightness = (int) (value * 255);
l_digit[i].setText(String.valueOf(value));
l_digit[i].setBackground(new Color(brightness, brightness, brightness));
}
l_target.setText(String.valueOf(target));
l_result.setText(String.valueOf(result));
this.revalidate();
}
谢谢你的每一个 awnser,抱歉我的英语不好。
最简单的做法是启动一个新线程。
@Override
public void actionPerformed(ActionEvent e) {
new Thread( ()->{
for (int i = 0; i < iMax; i++) {
...
final int fi = i;
EventQueue.invokeLater( ()->{
digitRefresh(reader.getInputs()[fi], (int) reader.getInputs()[fi][0], 0);
});
}).start();
}
现在所有的工作都在一个单独的线程上完成,然后当 ...
工作完成时,从 EDT 调用数字刷新方法。注意最后的 int fi 部分。关于在线程上来回切换有一些注意事项,因此最好研究比仅使用线程更好的控件。
例如摇摆工人:
How do I use SwingWorker in Java?