Jump to content

ProgressMonitor numa linha de código...


Recommended Posts

Posted

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

Posted

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.

I haven’t lost my mind; it’s backed up on DVD somewhere!

Posted

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

Posted (edited)

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("email", "pass"); // email e pass
	email.setSSL(true);
        //email.setSmtpPort(465); (se nao der... experimentar)
	email.addTo(jTextField1.getText()); //destinatario
	email.setFrom("email"); //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...

Edited by KiNgPiTo
Posted

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.

Posted

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.

I haven’t lost my mind; it’s backed up on DVD somewhere!

Posted

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?

Posted

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?

Posted

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.