Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Java Mail API and Swing Application Framework

843810Jul 16 2010 — edited Jul 28 2010
Hello, I built a Desktop Application with NetBeans IDE 6.9 using New Project / Java / Java Desktop Application (based on the Swing Application Framework JSR 296). An email has to be sent when a button ist being pressed. I use the latest Java Mail API 1.4.3. When I press the button, nothing happens but the application stops any reaction immediately and I have to kill it. The curious thing is that the same code used outside the Desktop Application Framework does work very well. Is there any incompatibility between Java Mail API and Swing Application Framework?

Here is the code, I hope for some helpful hints:


import org.jdesktop.application.Application;
import org.jdesktop.application.SingleFrameApplication;

public class EmailTestApp extends SingleFrameApplication {

@Override protected void startup() {
show(new EmailTestView(this));
}

public static EmailTestApp getApplication() {
return Application.getInstance(EmailTestApp.class);
}

public static void main(String[] args) {
launch(EmailTestApp.class, args);
}
}


import org.jdesktop.application.Action;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class EmailTestView extends FrameView {

public EmailTestView(SingleFrameApplication app) {
super(app);
initComponents();
}

@Action public void emailen() {
try {
Properties properties = new Properties();
properties.setProperty("mail.smtp.host", host);
properties.setProperty("mail.smtp.port", port);
properties.setProperty("mail.smtp.auth", "true");
Session session = Session.getInstance(properties, new Authenticator(){
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, passwd);
}
}
);
MimeMultipart mmp = new MimeMultipart();
MimeBodyPart mbp = new MimeBodyPart();
mbp.setText("Nachrichtentext", "UTF-8", "plain");
mmp.addBodyPart(nachrichtenText);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(addressFrom));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(addressTo));
message.setSubject(subject);
message.setSentDate(new Date());
message.setContent(mmp);

Transport.send(message);

} catch (Exception e) {
System.out.println(e);
}
}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {

mainPanel = new javax.swing.JPanel();
jButton1 = new javax.swing.JButton();

mainPanel.setName("mainPanel"); // NOI18N

javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(emailtest.EmailTestApp.class).getContext().getActionMap(EmailTestView.class, this);
jButton1.setAction(actionMap.get("email")); // NOI18N
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(emailtest.EmailTestApp.class).getContext().getResourceMap(EmailTestView.class);
jButton1.setText(resourceMap.getString("jButton1.text")); // NOI18N
jButton1.setName("jButton1"); // NOI18N

javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
mainPanel.setLayout(mainPanelLayout);
mainPanelLayout.setHorizontalGroup(
mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(mainPanelLayout.createSequentialGroup()
.addGap(68, 68, 68)
.addComponent(jButton1)
.addContainerGap(87, Short.MAX_VALUE))
);
mainPanelLayout.setVerticalGroup(
mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(mainPanelLayout.createSequentialGroup()
.addGap(63, 63, 63)
.addComponent(jButton1)
.addContainerGap(75, Short.MAX_VALUE))
);

setComponent(mainPanel);
}// </editor-fold>//GEN-END:initComponents

// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton jButton1;
private javax.swing.JPanel mainPanel;
// End of variables declaration//GEN-END:variables

}

Comments

843804
There is already a topic on this subject
http://forum.java.sun.com/thread.jsp?forum=57&thread=563889

Denis Krukovsky
http://dotuseful.sourceforge.net/
843804
I can't handel this classes. I didn't find out how to use them. Is there any other, maybe easier way to sort TreeNodes?
843804
Thanks for your feedback. What you need to do is
- create a Comparator for your nodes (I believe you know what it is?) or subclass org.dotuseful.ui.tree.SortedTreeNode and implement Comparable interface in it;
- substitute your TreeModel with org.dotuseful.ui.tree.AutomatedTreeModel;
- substitute your tree nodes with org.dotuseful.ui.tree.SortedTreeNode or its subclass, and optionally provide a Comparator for them.

Here is a sketch of a node class that you need
import org.dotuseful.ui.tree;
public class ABSortTreeNode extends SortedTreeNode implements Comparable
    public int compareTo(Object o) {
        MutableTreeNode node = (MutableTreeNode)o;
        return ((Comparable)getUserObject()).compareTo(node.getUserObject());
    }
}
So having this class, you only need to
- substitute your TreeModel with org.dotuseful.ui.tree.AutomatedTreeModel;
- substitute your tree nodes with ABSortTreeNode.

I believe this is pretty easy way to sort a tree. I would make my classes understandable for everyone, so please keep asking questions.

Denis Krukovsky
http://dotuseful.sourceforge.net/
843804
Hi,
The jtree nodes are sorted in jtree display.
But how to keep folders (non-leaf-nodes) and leaf-nodes sorted separately?
I�d like to have the leaf-nodes listed first under root and then all folders followed.
Any ideas? Do you have any samples related that?
Thank you for your help in advance.
843804
Hi,

Thank you for interest in dotuseful library. Good to have people who use our work.

I'm going to write an article about directory tree creation. Stay tuned on http://dotuseful.sourceforge.net/

For this time, what you need is to modify your Comparator or compareTo() method so your folders stay before your files.

Denis Krukovsky
http://dotuseful.sourceforge.net/
843805
This is not exactly what you are looking for but might give you an idea.

Hamed
/**
	 * @param root of tree
	 * @return sorted elements alphabetically
	 */
	public static DefaultMutableTreeNode sortTree(DefaultMutableTreeNode root) {
		for (int i = 0; i < root.getChildCount(); i++) {
			DefaultMutableTreeNode node = (DefaultMutableTreeNode) root
					.getChildAt(i);
			String nt = node.getUserObject().toString();
			for (int j=0; j<i; j++) {
				DefaultMutableTreeNode prevNode = (DefaultMutableTreeNode) root
				.getChildAt(j);
				String np = prevNode.getUserObject().toString();
				if (nt.compareToIgnoreCase(np)<0) {
					root.insert(node, j);
					root.insert(prevNode, i);
				}
			}
			if (node.getChildCount() > 0) {
				node = sortTree(node);
			}
		}
		return root;
	}
843805
This is not exactly what you are looking for but might give you an idea.
Thanks a lot for your code. It helped very much
843806
Thanks Hamed,

Well, I work in your code, and I post here.
  public static DefaultMutableTreeNode sortTree(DefaultMutableTreeNode root) {
        {
                 for (int i =0; i<root.getChildCount()-1; i++) {
                		DefaultMutableTreeNode node = (DefaultMutableTreeNode) root.getChildAt(i);
                        String nt = node.getUserObject().toString();

                        for (int j=i+1;j<=root.getChildCount()-1;j++)
                        {
                            	DefaultMutableTreeNode prevNode = (DefaultMutableTreeNode) root.getChildAt(j);
				                String np = prevNode.getUserObject().toString();

                            System.out.println(nt+" "+np);
                            if (nt.compareToIgnoreCase(np)>0) {

				                  	root.insert(node, j);
					                root.insert(prevNode, i);
				              }
                        }
                        if (node.getChildCount() > 0) {
				node = sortTree(node);
			}
                 }

                 return root;
        }
    }
and this code I used after include in jtree
  public  void jTreeSortingBegin()
    {
          dn = (DefaultMutableTreeNode)treeModel.getRoot();
          treeModel.reload();
          dn = sortTree(dn);
          treeModel.reload(dn);
    }
for exemple
  addObject(jTextField1.getText());
        jTreeSortingBegin();
843806
Thank you very much, Hamed, I only had to change your code a little, replacing
root.insert(prevNode, i);
with
break;
insert(prevNode) is not necessary as insert(node) will shift the rest of the nodes. Break is necessary to begin relocating the next child (in that case we'll be done with that one).

Edited by: Victor.E on May 27, 2009 2:38 AM
1 - 9
Locked Post
New comments cannot be posted to this locked post.

Post Details

Locked on Aug 25 2010
Added on Jul 16 2010
5 comments
620 views