Thread Splash Screen

5 respostas
N

Olá galera, estou com uma duvidazinha quanto ao uso de Thread.

Estou fazendo uma aplicação desktop para enviar dados de arquivos .txt para uma base de dados.

Nela, eu crio um form que recebe o endereço dos arquivos e após o submit é executada uma pequena aplicação para parsear os dados. Na execução dessa pequena aplicação eu estou utilizando 1 splash screen com 1 barra de progresso, mas estou tendo problemas com isso, pois a tela só é exibida quando a execução do programa é terminada.

Sei que uma das alternativas para resolução desse problema é o uso de threads, mas não estou entendendo como posso utilizá-la.

OBS: se eu criar 1 main na classe que instancia o splash screen e rodar a aplicação diretamente, a tela é exibida como eu desejo, mas quando eu coloco na aplicação que seleciona os arquivos, ela não exibe nada até terminar a execução.

Queria que alguém me ajudasse a ressolver esse pro. Preciso que a splas screen apareça no início da execução, atualizando a barra de progresso, e finalize quando for encerrada a execução da aplicação.

5 Respostas

F

Talvez te ajude

http://jroller.com/page/fabiofalci?entry=splashscreen

N

fabiofalci, para te ser bem franco: não entendi direito... rs

Tipo

vou postar aqui meu código da splash pra vc ver... pode ser q ajude bastante, a entender meu caso.

package etav.utils.gui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JWindow;
import javax.swing.border.Border;

import etav.utils.management.ImageManager;
import etav.utils.message.BundleUtils;

public class SplashScreen extends JWindow {
	
    private static final long serialVersionUID = 1L;
    private static SplashScreen splash = null;
    private JLabel iconLabel = null;
    private JProgressBar bar = null;
    private JPanel mainPanel = null;
    private Border border = null;
    
    private SplashScreen() {
    	super();
    	iconLabel = new JLabel();
    	mainPanel = new JPanel(new BorderLayout());
    	bar		  = new JProgressBar();
    	
    	init();
    }

    public static SplashScreen getInstance() {
    	if (splash == null) {
    		splash = new SplashScreen();
    	}
    	return splash;
    }
    
    private void init() {
    	try {
    		iconLabel.setIcon(ImageManager.createImageIcon(
    						  			BundleUtils.getMessage("image.title"), 
    						  			getClass()));
    	} catch (Exception e) {
			e.printStackTrace();
		}
		border = BorderFactory.createEmptyBorder();
		mainPanel.setBorder(border);
		mainPanel.add(iconLabel, BorderLayout.CENTER);
		mainPanel.add(bar, BorderLayout.SOUTH);
		this.getContentPane().add(mainPanel);
		this.pack();
		
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = this.getSize();

        if (frameSize.height > screenSize.height) {
            frameSize.height = screenSize.height;
        }
        if (frameSize.width > screenSize.width) {
            frameSize.width = screenSize.width;
        }
        this.setLocation((screenSize.width - frameSize.width) / 2,
        				 (screenSize.height - frameSize.height) / 2);
    }
    
    public void setStatus(long value) {
    	int intValue = new Double((value)).intValue();
    	bar.setValue(intValue);
    }
    
    public void showSplash() {
    	setVisible(true);
    }
    
    public void hideSplash() {
    	setVisible(false);
    	dispose();
    	splash = null;
    }
    
	public static void main(String[] args) {
		SplashScreen.getInstance().showSplash();
		
		for (long i = 0; i < 99999; i++) {
			SplashScreen.getInstance().setStatus(i);
		}
		SplashScreen.getInstance().hideSplash();
	}
}

Como eu te falei anteriormente, ela sendo executada só, funciona que é 1 maravilha, só q de forma concorrente, só é executada quando a aplicação q roda em segundo plano é finalizada.

Quanto a questão do link q vc me passou, eu não entendi como posso utilizar thread para garantir essa execução concorrente.

Se possível, vc poderia me explicar??

Agradeço desde já

F

Assim meu,
Aquele link q te passei tem um implementacao rapida q fiz de um splash screen…

Ele ja cria uma thread para a splashScreen!!!

SplashScreen splash = new SplashScreen();
splash.setProgressRegion(Region.SOUTH);
splash.setImagePath("/lobster/splash/eclipse.png");
splash.setProgressDimension(new Dimension(500, 15));

splash.showSplash();

Random r = new Random(System.currentTimeMillis());
for (int i = 0; i < 100; i++) {
    try {
        splash.addOneToProgress();
        Thread.sleep(r.nextInt(300));
    } catch (Exception e) {
        e.printStackTrace();
    }

}

Quando tu chama o
splash.showSplash();

Ele inicia o splash em uma thread (da uma olhada no codigo!!) e retorna…
entao esse codigo logo apos, pensa que eh o teu processo… pode ser uma copia de arquivos… qualquer coisa!!!
Onde o processo fica atualizando a splash com o valor dela, quando chegar a 100 ela fecha!!

entedeu?

N

Cara, eu entendi o q vc falou, mas eu refiz tua classe aqui, pra analisar o código melhor, e ta dando o mesmo erro que o meu… rs

N

O problema q tá acontecendo no meu é q ele nao consegue atualizar a tela… ele tá trabalhando certinho, só não exibe nada na tela… ele só desenha 1 quadrado branco… do tamanho da imagem com a barra de progresso… + n exibe… só exibe no final da execução…

Criado 8 de agosto de 2006
Ultima resposta 9 de ago. de 2006
Respostas 5
Participantes 2