JProgressbar e validação de arquivo - separação da camada de visualização das regras de negócio

Colegas, troço complicado esse de conseguir exibir o andamento de algum processo em uma barra de progresso em java, hein?!

Depois de pesquisar um bocado, enfim consegui algo, mas creio que não dá para separar totalmente as camadas de exibição das regras de negócio, né?

Criei uma classe chamada Arquivo com os métodos abrir(), fechar(), validarRegistros().
Porém tive que incluir também nesta classe componentes de visualização (JProgressBar e JDialog).

Daria para fazer diferente?

Abaixo os trechos simplificados.

Pequeno trecho do código no formulário principal que aciona o processo de verificação do arquivo (na classe FrmPrincipal.java).

    private void validarArquivo() {

        arquivo.validaRegistros((javax.swing.JFrame)FrmPrincipal.this);

        if (!arquivo.valido) {
            status = 1;
        } else {
            status = 2;
        }
    }

Trecho do código da classe Arquivo.java

import java.awt.Dimension;
import java.awt.Point;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.JFrame;

public class Arquivo {

    public File arquivo;
    private BufferedReader brArquivo;
    public String nomeArquivo;
    public String caminhoAbsoluto;
    public long tamanhoArquivo;
    private JProgressBar _progress = new JProgressBar(0, 0);
    private JDialog _loadingDialog = new JDialog();

    public Arquivo(File file) {

        _loadingDialog.setTitle("Validando");
        _loadingDialog.add(_progress);
        _loadingDialog.pack();
        _loadingDialog.setLocation(200, 200);

        arquivo = file;
        nomeArquivo = arquivo.getName();
        caminhoAbsoluto = arquivo.getAbsolutePath();
        tamanhoArquivo = arquivo.length();

        qtdLinhas = 0;

    }

    public void abrir() {
        try {
            brArquivo = new BufferedReader(new FileReader(arquivo));
        } catch (java.io.IOException e) {
            return;
        }
    }

    public void fechar() {
        try {
            brArquivo.close();
        } catch (java.io.IOException e) {
            return;
        }
    }


    public void validaRegistros(JFrame frame) {

        new OpenThread(frame).start();
    }

    private class OpenThread extends Thread {

        private JFrame frame;

        public OpenThread(JFrame _frame) {
            frame = _frame;
        }

        public void run() {
            int mNumLinha = 2;
            String mConteudoLinha;
            String mConteudoProximaLinha;
            String msg = "";
            String mTipoReg;


            _progress.setMaximum((int) tamanhoArquivo / 254);
            Dimension dsize = _loadingDialog.getSize();
            Dimension fsize = frame.getSize();
            Point p = new Point((fsize.width - dsize.width) / 2, (fsize.height - dsize.height) / 2);
            SwingUtilities.convertPointToScreen(p, frame);
            _loadingDialog.setLocation(p);

            try {
                while ((mConteudoLinha = brArquivo.readLine()) != null) {
                    qtdLinhas++;
                    incrementProgress();
			
		    // aqui entra o código de verificação de cada linha

            } catch (java.io.IOException e) {
			return null;
            }

            fechar();

            finish();
        }
    }

    void incrementProgress() {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                if (!_loadingDialog.isVisible()) {
                    //Dimension dsize = _loadingDialog.getSize();   
                    //Dimension fsize = frmPrincipal.getSize();   
                    //Point p = new Point((fsize.width-dsize.width)/2, (fsize.height-dsize.height)/2);   
                    //SwingUtilities.convertPointToScreen(p, frmPrincipal);   
                    //_loadingDialog.setLocation(p);   
                    _loadingDialog.setVisible(true);
                }
                _progress.setValue(_progress.getValue() + 1);
            }
        });
    }

    void finish() {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                _progress.setValue(0);
                _loadingDialog.setVisible(false);
            }
        });
    }
}