Olá pessoal.
Estou com um problema na hora de exibir uma tela Splash.
No meu sistema, tenho a opção de fazer backup do banco; como esta é uma tarefa pesada, gostaria de exibir na tela uma mensagem informando que o backup esta sendo feito; e, quando terminar esta mensagem some e aparece um JoptionalPanel informando que o backup foi concluído.
Mas a mensagem só aparece depois que o backup termina, ou seja, no momento do backup parece que o sistema está travado, e depois exibe as duas telas simultânea.
Me disseram que o splash só funciona antes do sistema iniciar. (dentro do main). E agora, o que posso fazer, alguém tem alguma solução?
Isso que você quer não é Splash Screen, mas uma janela de progresso.
O seu problema é que está executando o Backup na Thread EDT do Swing, com isso todas as outras ações de tela ficam bloqueadas.
Para detalhes, leia esta documentação: http://download-llnw.oracle.com/javase/tutorial/uiswing/concurrency/index.html
wfs
Julho 29, 2010, 1:57pm
#3
O mesmo tenho que fazer no meu sistema, tentei usar o SplashScreen, porém não exibe a tela SplashScreen durante o backup que realizo.
Isso é importante para o cliente saber que algo está sendo executado, e não pensar que um erro ocorreu.
Se alguém souber de alguma dica, agradeço.
[quote=wfs]O mesmo tenho que fazer no meu sistema, tentei usar o SplashScreen, porém não exibe a tela SplashScreen durante o backup que realizo.
Isso é importante para o cliente saber que algo está sendo executado, e não pensar que um erro ocorreu.
Se alguém souber de alguma dica, agradeço.[/quote]
A dica é ler o artigo que o colega ali em cima já passou. Ele dá o exemplo de como criar uma barra de progresso. Esse aqui também pode ser útil:
http://download.oracle.com/javase/tutorial/uiswing/components/progress.html
[quote=samuel.grigolato]Isso que você quer não é Splash Screen, mas uma janela de progresso.
O seu problema é que está executando o Backup na Thread EDT do Swing, com isso todas as outras ações de tela ficam bloqueadas.
Para detalhes, leia esta documentação: http://download-llnw.oracle.com/javase/tutorial/uiswing/concurrency/index.html [/quote]
Obrigado Samuel, vou tentar resolver o problema, se eu conseguir eu mudo o tópico para resolvido.
Olá ViniGodoy e Samuel, vocês deram uns links para resolução do problema. Mas eu já tentei de tudo, virei a madrugada e nada. está do mesmo jeito que o Splash Screen.
Ele só exibe o ProgressBar quando termina de executar o backup.
Tem como vocês ou outra pessoa postar um exemplo de uma execução simultânea que rode em uma classe comum sem ser dentro do método main.
Grato.
Obs.: Qual foi o mentiroso que inventou o Thread? rsrsrs.
Não é possível. Você chegou a criar outra thread? Ou a disparar o SwingWorker?
Posta aí seu código.
[quote=ViniGodoy]Não é possível. Você chegou a criar outra thread? Ou a disparar o SwingWorker?
Posta aí seu código.[/quote]
Classe ProgressBar.java
[code]import control.Consultorio;
import java.awt.;
import javax.swing. ;
import java.beans.*;
import java.util.Random;
public class ProgressBar extends JPanel implements PropertyChangeListener {
private JProgressBar progressBar;
private JLabel fases;
private Task task;
private static JDialog frame;
private static String caminho;
private static Consultorio controladora;
private static BackupBanco backup;
class Task extends SwingWorker<Void, Void> {
@Override
public Void doInBackground() {
Random random = new Random();
int progress = 0, fase = 1;
setProgress(0);
try {
//Executa o Backup do banco e o ProgressBar fica parado
new MyThread(backup, caminho, controladora).run();
while (progress < 100) {
//Sleep for up to one second.
Thread.sleep(random.nextInt(1000));
//Make random progress.
progress += random.nextInt(10);
setProgress(Math.min(progress, 100));
if ((progress >= 100) && (BackupBanco.situacao == false)) {
fase++;
setProgress(0);
progress = 0;
fases.setText("Fase: " + fase);
}
}
} catch (Exception ignore) {
ignore.getLocalizedMessage();
}
return null;
}
@Override
public void done() {
Toolkit.getDefaultToolkit().beep();
setCursor(null);
JOptionPane.showMessageDialog(null, "Backup efetuado com sucesso!", "Informação", JOptionPane.INFORMATION_MESSAGE);
}
}
public ProgressBar() {
super(new BorderLayout());
progressBar = new JProgressBar(0, 100);
progressBar.setValue(0);
progressBar.setStringPainted(true);
fases = new JLabel("Fase: 1");
fases.setVisible(true);
JPanel panel = new JPanel();
panel.add(fases);
panel.add(progressBar);
add(panel, BorderLayout.PAGE_START);
setBorder(BorderFactory.createEmptyBorder(25, 30, 25, 30));
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
task = new Task();
task.addPropertyChangeListener(this);
task.execute();
}
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
int progress = (Integer) evt.getNewValue();
progressBar.setValue(progress);
}
}
public static void createAndShowGUI() {
frame = new JDialog();
frame.setTitle("Efetuando Backup");
frame.setModal(true);
JComponent newContentPane = new ProgressBar();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void IniciarProgressBar(String caminho, Consultorio c, BackupBanco b) {
ProgressBar.caminho = caminho;
ProgressBar.controladora = c;
ProgressBar.backup = b;
//ProgressBar.backupBanco = bac;
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}[/code]
Classe MyThread.java
[code]import control.Consultorio;
import java.util.logging.Level;
import java.util.logging.Logger;
public class MyThread extends Thread implements Runnable {
private BackupBanco backupBanco;
private String caminho;
private Consultorio controladora;
public MyThread(BackupBanco backupBanco, String caminho, Consultorio controladora) {
super();
this.backupBanco = backupBanco;
this.caminho = caminho;
this.controladora = controladora;
//setPriority(MAX_PRIORITY);
}
@Override
public void run() {
try {
backupBanco.executarBackupBD(this.caminho, this.controladora);
} catch (Exception ex) {
Logger.getLogger(MyThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
}[/code]
O método rum que executa o backup.
Grato
Sim, para para disparar em outra thread, você deve chamar o método start(). É ele que chama o run:
Troque:
new MyThread(backup, caminho, controladora).run();
Para:
new MyThread(backup, caminho, controladora).start();
[quote=ViniGodoy]Sim, para para disparar em outra thread, você deve chamar o método start(). É ele que chama o run:
Troque:
new MyThread(backup, caminho, controladora).run();
Para:
new MyThread(backup, caminho, controladora).start();
[/quote]
Perfeito ViniGodoy, agora está funcionando.
Muito Obrigado.