JTable + Timer

Caros,

Estou criando um cadastro/formulário, onde ele será “multiusuário”, ou seja, 2 usuários poderão abrir esse simples aplicativo .jar e cadastrar/alterar informações salvar em um arquivo .txt .

Para meio que trabalhar em “tempo real”, criei um método que atualiza constantemente a JTable (Rows), ou seja, assim que um usuário cadastrar/alterar e salvar alguma informação o outro imediatamente saberá que veio alterado, visualizando a tabela.

O que acontece é que devido ao número e a velocidade de em que trato os métodos para load da tabela, não consigo carregar nenhuma informação nos meus JTextFields (campos onde assim que clico em alguma linha, são preechidos pelos respectivos dados).

Alguém sabe alguma dica, alguma “lógica” ou alguma outra maneira para que eu possa chegar no mesmo resultado.

Segue a baixo o método Main (Principal):

public class Main {

    private JFrame janela;
    private JLabel labelTe;
    private JLabel labelChipras;
    private JLabel labelNome;
    private JLabel labelDtnasc;
    private JLabel labelGrau;
    private JLabel labelStatus;
    private JTextField textTe;
    private JTextField textChipras;
    private JTextField textNome;
    private JTextField textDtnasc;
    private JTextField textGrau;
    private JComboBox comboStatus;
    private JPanel painel;
    private JButton atualizar;
    private JButton cadastrar;
    private JButton limpar;
    private JButton excluir;
    private JMenuBar menuBar;
    private JMenu file;
    private JMenu edit;
    private JMenu about;
    private JMenuItem menuSalvar;
    private JMenuItem menuSair;
    private JMenuItem menuTelaCheia;
    private JMenuItem menuSobre;
    private JPanel buttons;
    private List<Cadastro> clientes;
    private Cadastro_Table cad;
    private JTable tabela;
    private String filename;
    public static final long TEMPO = (long) (1000 * 0.005);

    public Main(String filename) {
        this.filename = filename;
        clientes = new ArrayList<Cadastro>();

        JFrame.setDefaultLookAndFeelDecorated(true);
        janela = new JFrame();
        janela.setTitle("? MENU ? " + "( " + filename + " )");
        janela.setLayout(new BorderLayout());
        janela.setSize(900, 700);
        janela.setLocationRelativeTo(null);
        janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        menuBar = new JMenuBar();

        file = new JMenu("File");
        menuSalvar = new JMenuItem("Salvar ");
        menuSalvar.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
        menuSalvar.getAccessibleContext().setAccessibleDescription(null);
        menuSalvar.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent acSalvar) {
                write();
            }
        });
        menuSair = new JMenuItem("Sair ");
        menuSair.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, ActionEvent.ALT_MASK));
        menuSair.getAccessibleContext().setAccessibleDescription(null);
        menuSair.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent acSair) {
                System.exit(0);
            }
        });
        file.add(menuSalvar);
        file.addSeparator();
        file.add(menuSair);

        edit = new JMenu("Edit");
        menuTelaCheia = new JMenuItem("Tela Cheia ");
        menuTelaCheia.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, ActionEvent.SHIFT_MASK));
        menuTelaCheia.getAccessibleContext().setAccessibleDescription(null);
        menuTelaCheia.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent acTelaCheia) {
                janela.setExtendedState(JFrame.MAXIMIZED_BOTH);
            }
        });
        edit.add(menuTelaCheia);

        about = new JMenu("About");
        menuSobre = new JMenuItem("Sobre ");
        menuSobre.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.ALT_MASK));
        menuSobre.getAccessibleContext().setAccessibleDescription(null);
        menuSobre.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent acSobre) {
                JOptionPane.showMessageDialog(null, "Desenvolvido Por: "
                        + "\n" + "\n" + "? Antônio.Filho"
                        + "\n" + "\n" + "Versão 2.0" + "\n",
                        "Sobre", JOptionPane.PLAIN_MESSAGE);
            }
        });
        about.add(menuSobre);

        menuBar.add(file);
        menuBar.add(edit);
        menuBar.add(about);
        janela.setJMenuBar(menuBar);

        labelTe = new JLabel("  TE");
        labelChipras = new JLabel("  CHIPRAS");
        labelNome = new JLabel("  NOME");
        labelDtnasc = new JLabel("  DATA NASCIMENTO");
        labelGrau = new JLabel("  GRAU PARENTESCO");
        labelStatus = new JLabel("  STATUS");

        textTe = new JTextField();
        textChipras = new JTextField();
        textNome = new JTextField();
        textDtnasc = new JTextField();
        textGrau = new JTextField();
        comboStatus = new JComboBox(Cadastro.c_Status);
        comboStatus.setSelectedIndex(0);

        painel = new JPanel(new GridLayout(6, 2));
        painel.add(labelTe);
        painel.add(textTe);
        painel.add(labelChipras);
        painel.add(textChipras);
        painel.add(labelNome);
        painel.add(textNome);
        painel.add(labelDtnasc);
        painel.add(textDtnasc);
        painel.add(labelGrau);
        painel.add(textGrau);
        painel.add(labelStatus);
        painel.add(comboStatus);

        cadastrar = new JButton("Cadastrar");
        cadastrar.setMnemonic(KeyEvent.VK_C);
        cadastrar.setToolTipText("Clique aqui para cadastrar/editar.");
        cadastrar.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if (textNome.getText().compareTo("") == 0) {
                    JOptionPane.showMessageDialog(null, "Campo Nome Vazio !",
                            "Erro", JOptionPane.ERROR_MESSAGE);
                } else {
                    String status = (String) comboStatus.getSelectedItem();
                    try {
                        int linha = tabela.getSelectedRow();
                        Cadastro c = clientes.get(linha);
                        c.setStatus(status);
                        cad.setClientes(clientes);
                        limparCadastro();
                    } catch (Exception exCad) {
                        JOptionPane.showMessageDialog(null, "Erro ao Cadastrar!",
                                "Erro", JOptionPane.ERROR_MESSAGE);
                    }
                }
            }
        });

        limpar = new JButton("Limpar");
        limpar.setEnabled(false);
        limpar.setMnemonic(KeyEvent.VK_L);
        limpar.setToolTipText("Clique aqui para limpar os campos.");
        limpar.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                limparCadastro();
            }
        });

        excluir = new JButton("Excluir");
        excluir.setEnabled(false);
        excluir.setMnemonic(KeyEvent.VK_E);
        excluir.setToolTipText("Clique aqui para excluir.");
        excluir.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                int linha = tabela.getSelectedRow();
                if (linha < 0) {
                    JOptionPane.showMessageDialog(null,
                            "Favor Selecione uma Linha!", "Erro", JOptionPane.ERROR_MESSAGE);
                } else {
                    Object[] options = {"Sim", "Não"};
                    int buttonExcluir = JOptionPane.showOptionDialog(null,
                            "Você Deseja Excluir?", "Excluir",
                            JOptionPane.YES_NO_OPTION,
                            JOptionPane.QUESTION_MESSAGE,
                            null, options, options[0]);
                    if (buttonExcluir == JOptionPane.YES_OPTION) {
                        clientes.remove(linha);
                        cad.setClientes(clientes);
                        limparCadastro();
                    } else {
                    }
                }
            }
        });

        atualizar = new JButton("Atualizar");
        atualizar.setMnemonic(KeyEvent.VK_T);
        atualizar.setToolTipText("Clique aqui para atualizar.");
        atualizar.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                clientes.removeAll(clientes);
                load();
                cad.setClientes(clientes);
            }
        });

        buttons = new JPanel();
        buttons.add(cadastrar);
        buttons.add(limpar);
        buttons.add(excluir);

        load();
        tempo();
        cad = new Cadastro_Table();
        cad.setClientes(clientes);

        tabela = new JTable();
        tabela.setAutoCreateRowSorter(false);
        tabela.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent eMouse) {
                if (eMouse.getClickCount() >= 0) {
                    int linha = tabela.getSelectedRow();
                    if (linha >= 0) {
                        Cadastro c = clientes.get(linha);
                        textTe.setText(c.getTe());
                        textChipras.setText(c.getChipras());
                        textNome.setText(c.getNome());
                        textDtnasc.setText(c.getDtnasc());
                        textGrau.setText(c.getGrau());
                        comboStatus.setSelectedItem(c.getStatus());
                        limpar.setEnabled(true);
                        excluir.setEnabled(false);
                    }

                }
            }
        });
        tabela.setModel(cad);

        janela.add(painel, BorderLayout.NORTH);
        janela.add(buttons, BorderLayout.EAST);
        janela.add(new JScrollPane(tabela), BorderLayout.SOUTH);
        janela.setVisible(true);


    }

    public void load() {
        try {
            StringTokenizer lineToken;
            FileReader file = new FileReader(filename);
            BufferedReader buffer = new BufferedReader(file);
            boolean fim_arq = false;
            while (!fim_arq) {
                String line = buffer.readLine();
                if (line == null) {
                    fim_arq = true;
                } else {
                    try {
                        lineToken = new StringTokenizer(line, ";");
                        String te = lineToken.nextToken();
                        String chipras = lineToken.nextToken();
                        String nome = lineToken.nextToken();
                        String dtnasc = lineToken.nextToken();
                        String grau = lineToken.nextToken();
                        String status = lineToken.nextToken();
                        clientes.add(new Cadastro(te, chipras, nome, dtnasc, grau, status));
                    } catch (Exception exLoad) {
                    }
                }
            }
            buffer.close();
            file.close();
        } catch (IOException exLoad) {
        }
    }

    public void write() {
        try {
            FileWriter file = new FileWriter(filename);
            BufferedWriter buffer = new BufferedWriter(file);
            for (int i = 0; i
                    < clientes.size(); i++) {
                Cadastro c = clientes.get(i);
                String linha = c.getTe()
                        + ";" + c.getChipras()
                        + ";" + c.getNome()
                        + ";" + c.getDtnasc()
                        + ";" + c.getGrau()
                        + ";" + c.getStatus()
                        + ";" + "\n";
                buffer.write(linha);
            }
            buffer.close();
            file.close();
            JOptionPane.showMessageDialog(null, "Arquivo " + filename + " Salvo!", "Atenção", JOptionPane.INFORMATION_MESSAGE);
        } catch (IOException exWrite) {
            JOptionPane.showMessageDialog(null, exWrite.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        }
    }

    public void limparCadastro() {
        textTe.setText("");
        textChipras.setText("");
        textNome.setText("");
        textDtnasc.setText("");
        textGrau.setText("");
        comboStatus.setSelectedIndex(0);
        textTe.requestFocus();
        limpar.setEnabled(false);
        excluir.setEnabled(false);
    }

    public void tempo() {
        Timer timer = null;
        if (timer == null) {
            timer = new Timer();
            TimerTask tarefa = new TimerTask() {

                public void run() {
                    try {
                        clientes.removeAll(clientes);
                        load();
                        cad.setClientes(clientes);
                    } catch (Exception e) {
                    }
                }
            };
            timer.scheduleAtFixedRate(tarefa, TEMPO, TEMPO);
        }
    }

    public static void main(String args[]) {
        String nomeArq = JOptionPane.showInputDialog("Nome do Arquivo") + ".dat";
        new Main(nomeArq);
    }
}

Att.
Antônio