如何 "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?