JFrame Só aparece depois do processamento

3 respostas
viniciusfaleiro

Olá galera.
Preciso de uma mão… Tenho um programa que importa um arquivo em TXT pra um banco de dados… O arquivo tem bastante linhas e isso demanda tempo do processdor… Estou tentando fazer um esquema pra quando o usuário clicar para importar o arquivo, aparece na tela um JFrame sem as bordas escrito “aguarde”.
Porém… esse JFrame só aparece depois do arquivo copiado!!! (ou seja, quando não há mais processamento).

Já tentei criar um thread pra cada um (uma que importaria o arquivo e a outra que apareceria o JFrame) e dar prioridade para o JFrame. Sem sucesso… Não sei mais o que fazer…

Segue o código

public class WaitScreen extends JFrame implements Runnable{
	Thread runner;
	
	public WaitScreen(){
		
	}  

	public WaitScreen(String name) { 	
	    runner = new Thread(this, name);
	    runner.start();	
	    runner.setPriority(10);
	}
	    
	public void stop(){
	   runner.stop();
	}	
	
	public void run() {
		setUndecorated(true);
        initComponents();
        setBackground(new java.awt.Color(255, 255, 255));
        this.setAlwaysOnTop(true);
        this.setVisible(true);
	}
public void actionPerformed(ActionEvent arg0) {	
				JFileChooser fileChooser = new JFileChooser();
				WaitScreen t = new WaitScreen("thread");
				int returnValue = fileChooser.showOpenDialog(null);
				if (returnValue == JFileChooser.APPROVE_OPTION) {
					
					File selectedFile = fileChooser.getSelectedFile();
					try{
					BDDataTransfer transf = new BDDataTransfer();
		
					transf.trasfData(selectedFile.getAbsolutePath());
							
					}catch(Exception e){
						t.stop();
						//JOptionPane.showMessageDialog(null, "Erro ao importar arquivo:" + e.getMessage());	
					 }	
					t.stop();
					}

3 Respostas

Marcelo_FS
  • Um JFrame Runnable? Esse conceito é novo pra mim :smiley:
  • Vc manda abrir sua WaitScreen antes de escolher o arquivo?!?
  • Não seria mais fácil vc deixar a Thread principal exibindo a mensagem de espera em um JFrame normal, e iniciar o processamento em uma segunda Thread? Ou ainda tirar a segunda thread, e alterar o fluxo do programa (escolhe arquivo > exibe tela > inicia transferência)?
viniciusfaleiro

Primeiramente obrigado pela ajuda…

1- Eu não conheço mto de threads… comecei a ler sobre o assunto pra tenter resolver esse problema… Tentei implementear um runnable no JFrame pra pegar a thread e dar prioridade… (Pelo jeito… nada…).

2- Com certeza… eu inicio esse JFrame antes de começar a transferência do arquivo

3- Não entendi muito sua sugestão más gostaria de entender melhor… Preciso mto resolver esse problema pois tem uma empresa interessada… =)…

Obrigado desde já!

Marcelo_FS

Bem, eu faria algo do tipo…

public void actionPerformed(final ActionEvent arg0) {
		final JFileChooser fileChooser = new JFileChooser();
		final int returnValue = fileChooser.showOpenDialog(null);
		if (returnValue == JFileChooser.APPROVE_OPTION) {
			final WaitScreen screen = new WaitScreen();
			final File selectedFile = fileChooser.getSelectedFile();
			try {
				// aqui começa a Thread de transferência do arquivo
				// manda a tela como parâmetro para fechá-la qdo terminar o
				// processo
				final BDDataTransferThread transf = new BDDataTransferThread(
						screen);
				transf.trasfData(selectedFile.getAbsolutePath());
				transf.start();
			} catch (final Exception e) {
				JOptionPane.showMessageDialog(null, "Erro ao importar arquivo:"
						+ e.getMessage());
			}
			// aqui a transferência já começou a transferência, mas vc pode
			// definir a tela de espera numa boa pq estará executando em uma
			// thread separada
			screen.setVisible(true);
		}
	}

public class WaitScreen extends JFrame{...}

Pelo menos pra mim parece mais lógico… Agora, eu tava testando seu código aqui, e do jeito que tá não abre o frame mesmo… mas se iniciar a Thread fora do construtor funciona:

public class WaitScreen extends JFrame implements Runnable {

	public WaitScreen() {
	}

	public WaitScreen(final String name) {
	}

	public void run() {
		this.setUndecorated(true);
		this.setBackground(new java.awt.Color(255, 255, 255));
		this.setSize(100, 100);
		this.setAlwaysOnTop(true);
		this.setVisible(true);
	}

	public static void main(final String[] args) {
		final WaitScreen s = new WaitScreen();
		new Thread(s).start();
	}
}
Criado 13 de dezembro de 2008
Ultima resposta 17 de dez. de 2008
Respostas 3
Participantes 2