• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

KiNgPiTo

ProgressMonitor numa linha de código...

11 mensagens neste tópico

Boas,

Isto pode ser um bocado básico, mas não estou a perceber

    public void enviarMail() {

        ProgressMonitor pm = new ProgressMonitor(mainPanel, "A enviar email", "", 0, 100);

        pm.setMillisToPopup(0);
        pm.setMillisToDecideToPopup(0);

        pm.setProgress(10);

	SimpleEmail email = new SimpleEmail();

	try {
	email.setDebug(true);
	email.setHostName("smtp.gmail.com");
	email.setAuthentication("mail", "pass"); // email e pass
	email.setSSL(true);
        //email.setSmtpPort(465); (se nao der... experimentar)
	email.addTo(jTextField1.getText()); //destinatario
	email.setFrom("mail"); //emai de envio tem de ser igual ao de autenticação
	email.setSubject(jTextField2.getText());
	email.setMsg(jTextArea1.getText());
	email.send();

        JOptionPane.showMessageDialog(mainPanel, "Enviado");

	} catch (EmailException e) {

	JOptionPane.showMessageDialog(mainPanel, e.getMessage());

	}

    }

Este código é utilizado para enviar um email... O meu problema está ser associar a linha de código email.send(); ao ProgressMonitor de modo a que á medida que vai enviando o email, a barra fosse aumentando ou algo parecido...

Alguma sugestão?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Salvo erro não sei se consegues fazer isso assim mas por acaso nunca aprofundei totalmente esses componentes.

Aqui http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html podes encontrar tudo sobre como trabalhar a monitorização. Não te sei dizer muito mais e infelizmente tempo também não é coisa que tenha tido muito ultimamente lol

Qualquer duvida posta.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu já consegui fazer uma brincadeira com delays em que acrecenta 10% por segundo mas lá está, tal como no exemplo só muda o estado por cada passo concluido...

No que estou a tentar fazer, não quero as percentagens nem evolução... quero aquilo a que chamam de indeterminate mode em que aparece uma barra simplesmente a andar de um lado para o outro até que a operação esteja concluido... É aqui que surge a duvida... O código ao ser executado, o programa pára enquanto aquela linha (ou seja, o email não for enviado, o que ainda pode demorar um bocado consoante o tamanho) e ao parar tudo pára também a barra...

Andei a investigar e encontrei algumas coisas sobre um método doInBackground() mas não encontrei de como o implementar... Alguma Ajuda?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pela ajuda... Com os exemplos que arranjas-te e outras pesquisas aqui fica a maneira que consegui pôr isto a funcionar como queria...

    public void enviarEmail() {
        
	new SwingWorker<Object, Object>() {
		@Override
		protected Object doInBackground() throws Exception {

	SimpleEmail email = new SimpleEmail();
        
	try {

        progressBar.setVisible(true);
        progressBar.setIndeterminate(true);
        progressBar.setString("A enviar email...");
        progressBar.setStringPainted(true);

	email.setDebug(true);
	email.setHostName("smtp.gmail.com");
	email.setAuthentication("j.ribeiro.fafe@gmail.com", "*****"); // email e pass
	email.setSSL(true);
        //email.setSmtpPort(465); (se nao der... experimentar)
	email.addTo(jTextField1.getText()); //destinatario
	email.setFrom("j.ribeiro.fafe@gmail.com"); //email de envio tem de ser igual ao de autenticação
	email.setSubject(jTextField2.getText());
	email.setMsg(jTextArea1.getText());
        email.send();

        progressBar.setString("Email Enviado...");
        progressBar.setIndeterminate(!true);
        JOptionPane.showMessageDialog(mainPanel, "Email enviado com sucesso...");

        progressBar.setVisible(!true);
        
        return true;

	} catch (EmailException e) {

	JOptionPane.showMessageDialog(mainPanel, e.getMessage());

        return false;
        
        }

		}

		@Override
		protected void done() {
			try {
				Object obj = get();
                    if(obj.toString() == "true")
				JOptionPane.showMessageDialog(mainPanel, "Operacao concluida com sucesso. ");
			} catch (Exception e) {
				e.printStackTrace();
			}

		}
	}.execute();
        
}

Se alguém tiver alguma sugestão para melhorar, agradecia, mas basicamente já faz o que queria...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah, o vitortomaz foi mais rápido, mas é giro quando se colocam passwords, mesmo que o e-mail não seja usado para receber informação importante, e até ajuda a ver que tipo de passwords usas ;)

Alterei o código mas seria conveniente mudar a password, e já agora, usa uma password mais elaborada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Penso que melhor só mesmo usando o output do debug para ir avançando a barra mas ai terias de ter uma Thread á parte para isso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah, o vitortomaz foi mais rápido, mas é giro quando se colocam passwords, mesmo que o e-mail não seja usado para receber informação importante, e até ajuda a ver que tipo de passwords usas ;)

Alterei o código mas seria conveniente mudar a password, e já agora, usa uma password mais elaborada.

a pass era só para esse email... obrigado por tirares.. :)

Só mais uma coisa...

No método doInBackground() como é que faço para poder cancelar o que estiver a ser executado em background?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ultima versão do método ;)

    public void enviarEmailBack() {

	final SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
		@Override
		protected Object doInBackground() throws Exception {

          jButton23.setEnabled(false);
          cancelarBDF.setEnabled(!false);

          conf = true;
          progressBar.setVisible(true);
          progressBar.setIndeterminate(true);
          progressBar.setString("A enviar email...");
          progressBar.setStringPainted(true);

          String docc = "Docs\\temp" + nomeDocpImp + ".pdf";

	  File f = new File(docc);

	  EmailAttachment attachment = new EmailAttachment();
	  attachment.setPath(f.getPath());
	  attachment.setDisposition(EmailAttachment.ATTACHMENT);
	  attachment.setDescription("File");
	  attachment.setName(f.getName()); // Obtem o nome do arquivo

	  try {

            Connection con = DriverManager.getConnection(BDliga);
            PreparedStatement ps = con.prepareStatement("select * from email where pos = 1");
            ps.execute();

            ResultSet rs = ps.getResultSet();
            rs.next();

		MultiPartEmail email = new MultiPartEmail();
		email.setDebug(true);
		email.setHostName(rs.getString("serversmtp"));
		email.setAuthentication(rs.getString("endereco"), rs.getString("palavrapasse"));
		email.setSSL(true);
            email.addTo(jTextField5.getText()); //destinatario
            email.setFrom(rs.getString("endereco")); //email de envio tem de ser igual ao de autenticação
            email.setSubject(jTextField6.getText());
            email.setMsg(jTextPane2.getText());

		email.attach(attachment);

		email.send();

        progressBar.setString("Email Enviado...");
        progressBar.setIndeterminate(!true);
        JOptionPane.showMessageDialog(jJanEnviarEmail, "Documento enviado com sucesso via E-mail");

        progressBar.setVisible(!true);

        cancelarEnviarEmail();

        jButton23.setEnabled(!false);
        cancelarBDF.setEnabled(false);
        conf = false;
        return true;

	} catch (EmailException e) {
		JOptionPane.showMessageDialog(jJanEnviarEmail, e.getMessage());
            conf = false;
            progressBar.setIndeterminate(false);
            progressBar.setString("Erro ao enviar...");
            return false;
	}catch (SQLException se) {
		JOptionPane.showMessageDialog(jJanEnviarEmail, se.getMessage());
            conf = false;
            progressBar.setIndeterminate(false);
            progressBar.setString("Erro ao enviar...");
            return false;
        }

            }

		@Override
		protected void done() {
			try {
				Object obj = get();
                    conf = false;
        jButton23.setEnabled(!false);
        cancelarBDF.setEnabled(false);
			} catch (Exception e) {
				e.printStackTrace();
			}

		}

	};

      cancelarBDF.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event) {

          try{
            conf = true;
            progressBar.setIndeterminate(true);
            progressBar.setString("A cancelar envio...");
            sw.cancel(true);
            
          }catch(CancellationException ce){
            JOptionPane.showMessageDialog(jJanEnviarEmail, ce.getMessage() + "\n\n\n" + ce);
          }
      }
    });
            
        sw.execute();
}

Mas apesar do cancelar funcionar bem, este não está a cancelar imediatamente, ou seja, fiz um debug e o cancel() não avança a partir da linha em que se encontra mas ainda termina essa... Haverá alguma maneira de fazer com que termine imediatamente e não acabe de executar a linha de código que está a ser executada?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas apesar do cancelar funcionar bem, este não está a cancelar imediatamente, ou seja, fiz um debug e o cancel() não avança a partir da linha em que se encontra mas ainda termina essa... Haverá alguma maneira de fazer com que termine imediatamente e não acabe de executar a linha de código que está a ser executada?

Eu diria por norma não cancela imediatamente, repara que isso está a correr noutra thread e portanto terás sempre o tempo de notificação e detecção dessa notificação de cancelamento

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora