Как «refre sh» JFrame внутри метода actionperformed? - PullRequest
1 голос
/ 30 марта 2020

Я пытаюсь создать GUI для нейронной сети, которую я сделал недавно. Я использую набор данных MNIST и хочу отобразить рукописный ди git с использованием JPanels со значениями яркости, записанными внутри. При нажатии кнопки «поезд» сеть обучается и отображается каждый новый ди git. Однако это происходит в течение l oop в методе actionperformed кнопки, и кажется, что я не могу изменить фон надписей или текста (по крайней мере, он не отображает изменения) до последнего. Я не знаю, прав ли я, но, похоже, отображается только последнее изменение. Вот почему мой вопрос заключается в том, можно ли "refre sh" JFrame внутри метода actionperformed.

Я уже пробовал revalidate (), invalidate () & validate (), SwingUtilities.updateComponentTreeUI (кадр), но ни один из них не сработал.

Вот соответствующая часть моего кода:

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();
}

спасибо за все сообщения и извините за мой плохой английский sh.

1 Ответ

1 голос
/ 30 марта 2020

Самое простое, что нужно сделать - это запустить новый поток.

    @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();
    }

Теперь вся работа выполняется в отдельном потоке, затем, когда работа ... заканчивается, di git refre sh метод, вызванный из EDT. Обратите внимание на последнюю часть. Существуют предостережения о переходе назад и вперед по потокам, поэтому лучше взглянуть на более качественные элементы управления, чем просто использование потока.

Swing worker, например:

Как использовать SwingWorker в Java

...