どのようにのactionPerformedメソッド内「リフレッシュ」JFrameのか?

アレクセイ:

私は最近作られたニューラルネットワークのためのGUIを設計してみてください。私はMNIST-データセットを使用し、内側に書かれた輝度値とのJPanelを使用して手書きの数字を表示したいのです。ネットワーク - ボタン「電車」を押すことで訓練されますと、すべての新しい数字が表示されます。しかし、これはボタンののactionPerformedメソッド内のループのために起こり、最後の1まで(少なくともそれが変更を表示doesn't)私は、ラベルやテキストの背景を変更can'tようです。私は - 私の右かどうかを知っているドントそれだけで最後の変更が表示されることを思えます。私の質問は、それが「リフレッシュ」のactionPerformedメソッド内のJFrameすることが可能であるかどうかである理由That's。

私はすでに再検証()、無効()&検証()、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();
}

すべての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の部分に注目してください。それだけでスレッドを使用してより良いコントロールに外観に優れているので、スレッド上で前後に行くのは注意点があります。

例えば労働者をスイング:

どのように私はJavaでSwingWorkerのを使うのですか?

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=367387&siteId=1