Tou com um problema maldito que não consigo resolver há 3 dias, já tentei em uns 10 foruns (inclusive no da Sun), mas até agora nada.
Problema:
Tenho um método que faz uso de Runtime.getRuntime().exec(command) para acessar o GBAK (arquivo que faz cópia/restauração do banco de dados Firebird), esse processo leva alguns minutos para terminar.
O que preciso é que durante esse tempo uma saída seja impressa em um componente Swing.
Isso poderia ser um cronômetro em um JLabel ou até mesmo uma barra intermitente com JProgressBar.
Porém nada disso foi possível até agora. O componente Swing simplesmente não atualiza o texto ou valor.
Já tentei com e sem:
int exitVal = process.waitFor();
Todos sabem que com esse linha o JVM faz todo o resto esperar esse processo terminar.
O código que vou informar abaixo está tentando ativar uma barra intermitente antes do início desse processo com uma mensagem e depois do processo terminando tentando desativar a barra e mudar a mensagem.
private void setBackup(){
campoMens.setText("");
String gbak = getBinFolder()+"gbak.exe";
String command = gbak+" -v -t " +
"-user "+Lib.USUARIO+" " +
"-password "+Lib.SENHA+" " +
"localhost:"+Lib.CAMINHO_BD+" "+backupFile+" -y "+logFile;
Process process;
boolean exist = new File(gbak).exists();
if(exist){
barra.setString("Aguarde... Isso pode demorar...");
barra.setIndeterminate(true);
if(new File(backupFile).exists()){
boolean deleted = new File(backupFile).delete();
}
if(new File(logFile).exists()){
boolean deleted = new File(logFile).delete();
}
if(new File(zipFile).exists()){
boolean deleted = new File(zipFile).delete();
}
try {
process = Runtime.getRuntime().exec(command);
int exitVal = process.waitFor();
} catch (IOException ex) {
ex.printStackTrace();
}
catch (InterruptedException ex) {
ex.printStackTrace();
}
String str, mess = "";
try {
BufferedReader in = new BufferedReader(new FileReader(logFile));
while ((str = in.readLine()) != null) {
mess += str+"\n";
}
in.close();
} catch (IOException e) {}
campoMens.setText(mess);
campoMens.setCaretPosition(0);
barra.setString("Processo de backup terminado.");
barra.setIndeterminate(false);
} else {
campoMens.setText("O arquivo que executa o backup não está nessa máquina." +
"\nFavor executar esse procedimento na máquina onde o banco de dados está instalado.");
}
}
Alguma luz no fim do tunel???
Obrigado