0

I'm completely new to java and am trying to get some experience with programming java applets that can be opened from a browser. I was able to successfully open a simple "hello world" applet from a browser using the below javascript:

<script src="http://www.java.com/js/deployJava.js"></script>
<script> 
    var attributes = { code:'HelloWorld.class'} ; 
    var parameters = {codebase_lookup:'true'};
    deployJava.runApplet(attributes, parameters, '1.6'); 
</script>

And java class:

import javax.swing.JApplet;
import javax.swing.SwingUtilities;
import javax.swing.JLabel;

public class HelloWorld extends JApplet {
    //Called when this applet is loaded into the browser.
    public void init() {
        //Execute a job on the event-dispatching thread; creating this applet's GUI.
        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    JLabel lbl = new JLabel("Hello World");
                    add(lbl);
                }
            });
        } catch (Exception e) {
            System.err.println("createGUI didn't complete successfully");
        }
    }
}

This all worked fine. I tried another tutorial where I used the Swing designer in NetBeans to create a Celsius to Farenheit conversion GUI. I want to make this same GUI appear in an applet thats opened from a browser. To do that I tried instantiating it within an applet class. Both classes are embedded in a larger class so I assume that they have access to each other's methods (http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html).

/*
 * webApp.java
 *
 * Created on December 29, 2009, 1:25 PM
 */

//package learn;

/**
 *
 * @author  jake
 */

import javax.swing.JApplet;
import javax.swing.SwingUtilities;
import javax.swing.JLabel;

public class webApp { 
	class applet extends JApplet {
		//Called when this applet is loaded into the browser.
		public void init() {
			//Execute a job on the event-dispatching thread; creating this applet's GUI.
			try {
				SwingUtilities.invokeAndWait(new Runnable() {
					public void run() {
						new CelsiusConverterGUI().setVisible(true);
					}
				});
			} 
			catch (Exception e) {
				System.err.println("createGUI didn't complete successfully");
			}
		}
	}  
	class CelsiusConverterGUI extends javax.swing.JFrame {  
		/** Creates new form CelsiusConverterGUI */
		public CelsiusConverterGUI() {
			initComponents();
		}
		/** This method is called from within the constructor to
		* initialize the form.
		* WARNING: Do NOT modify this code. The content of this method is
		* always regenerated by the Form Editor.
		*/
		// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
		private void initComponents() {
			tempTextField = new javax.swing.JTextField();
			celsiusLabel = new javax.swing.JLabel();
			convertButton = new javax.swing.JButton();
			fahrenheitLabel = new javax.swing.JLabel();

			setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
			setTitle("Celsius Converter");

			tempTextField.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent evt) {
					tempTextFieldActionPerformed(evt);
				}
			});

			celsiusLabel.setText("Celsius");

			convertButton.setText("Convert");
			convertButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent evt) {
					convertButtonActionPerformed(evt);
				}
			});

			fahrenheitLabel.setText("Fahrenheit");

			javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
			getContentPane().setLayout(layout);
			layout.setHorizontalGroup(
			layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
			.addGroup(layout.createSequentialGroup()
				.addContainerGap()
				.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
					.addComponent(convertButton)
					.addComponent(tempTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 141, javax.swing.GroupLayout.PREFERRED_SIZE))
					.addGap(63, 63, 63)
					.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
						.addComponent(celsiusLabel)
						.addComponent(fahrenheitLabel))
						.addContainerGap(56, Short.MAX_VALUE))
			);
			layout.setVerticalGroup(
			layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
			.addGroup(layout.createSequentialGroup()
				.addContainerGap()
				.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
					.addComponent(tempTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
					.addComponent(celsiusLabel))
					.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
					.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
						.addComponent(convertButton)
						.addComponent(fahrenheitLabel))
						.addContainerGap(21, Short.MAX_VALUE))
			);

			layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {convertButton, tempTextField});

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

		private void tempTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tempTextFieldActionPerformed
			// TODO add your handling code here:
		}//GEN-LAST:event_tempTextFieldActionPerformed

		private void convertButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_convertButtonActionPerformed
			//Parse degrees Celsius as a double and convert to Fahrenheit.
			int tempFahr = (int)((Double.parseDouble(tempTextField.getText())) * 1.8 + 32);
			fahrenheitLabel.setText(tempFahr + " Fahrenheit");
		}//GEN-LAST:event_convertButtonActionPerformed
        	
		/**
		* @param args the command line arguments
		*/    
		// Variables declaration - do not modify//GEN-BEGIN:variables
		private javax.swing.JLabel celsiusLabel;
		private javax.swing.JButton convertButton;
		private javax.swing.JLabel fahrenheitLabel;
		private javax.swing.JTextField tempTextField;
		// End of variables declaration//GEN-END:variables   
	}
}

I compile this without errors and then use the same javascript described above with "webApp.class" replacing "HelloWorld.class". When I open the html file with the javascript, the applet says theres an error. Heres the details:

Java Plug-in 1.6.0_16
Using JRE version 1.6.0_16-b01 Java HotSpot(TM) Client VM
User home directory = /home/jake
----------------------------------------------------
c:   clear console window
f:   finalize objects on finalization queue
g:   garbage collect
h:   display this help message
l:   dump classloader list
m:   print memory usage
o:   trigger logging
q:   hide console
r:   reload policy configuration
s:   dump system and deployment properties
t:   dump thread list
v:   dump thread stack
x:   clear classloader cache
0-5: set trace level to <n>
----------------------------------------------------


java.lang.reflect.InvocationTargetException
	at com.sun.deploy.util.DeployAWTUtil.invokeAndWait(DeployAWTUtil.java:116)
	at sun.plugin2.applet.Plugin2Manager.runOnEDT(Plugin2Manager.java:3336)
	at sun.plugin2.applet.Plugin2Manager.createApplet(Plugin2Manager.java:2905)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1397)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.ClassCastException: webApp cannot be cast to java.applet.Applet
	at sun.plugin2.applet.Plugin2Manager$12.run(Plugin2Manager.java:2895)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:199)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception: java.lang.reflect.InvocationTargetException
java.lang.NullPointerException
	at sun.plugin2.applet.Plugin2Manager.findAppletJDKLevel(Plugin2Manager.java:2996)
	at sun.plugin2.applet.Plugin2Manager.createApplet(Plugin2Manager.java:2947)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1397)
	at java.lang.Thread.run(Thread.java:619)
Exception: java.lang.NullPointerException

If anyone has any idea what I'm doing wrong here or how I can fix this, a response would be greatly appreciated!!!

1
Contributor
1
Reply
4
Views
7 Years
Discussion Span
Last Post by jakethesnake86
0

So I got it working!! I'm just posting the code I ended up with incase it helps someone. I ended up using another tutorial at http://www.iam.ubc.ca/guides/javatut99/uiswing/start/swingApplet.html. I used the code from their AppletDemo example and integrated the temperature converter with it. So again, in case it helps someone, heres what I did. I just compile it with javac AppletDemo.java, then use an html file with the code posted below the java code.

AppletDemo.java:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.URL;

public class AppletDemo extends JApplet
                        implements ActionListener {

 		private javax.swing.JTextField tempTextField;
    private javax.swing.JLabel celsiusLabel;
    private javax.swing.JButton convertButton;
    private javax.swing.JLabel fahrenheitLabel;

    private boolean inAnApplet = true;

    //Hack to avoid ugly message about system event access check.
    public AppletDemo() {
        this(true);
    }

    public AppletDemo(boolean inAnApplet) {
        this.inAnApplet = inAnApplet;
        if (inAnApplet) {
            getRootPane().putClientProperty("defeatSystemEventQueueCheck",
                                            Boolean.TRUE);
        }
    }

    public void init() {
				// celsius converter below this line 
				//////////////////////////////////////////////////////////////////////////////////////////
        tempTextField = new javax.swing.JTextField();
        celsiusLabel = new javax.swing.JLabel();
        convertButton = new javax.swing.JButton();
        fahrenheitLabel = new javax.swing.JLabel();
	
        tempTextField.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tempTextFieldActionPerformed(evt);
            }
        });

        celsiusLabel.setText("Celsius");
				
        convertButton.setText("Convert");
//				convertButton.setActionCommand("convert");
				convertButton.setEnabled(true);

        convertButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                convertButtonActionPerformed(evt);
            }
        });

        fahrenheitLabel.setText("Fahrenheit");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(convertButton)
                    .addComponent(tempTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 141, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(63, 63, 63)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(celsiusLabel)
                    .addComponent(fahrenheitLabel))
                .addContainerGap(56, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(tempTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(celsiusLabel))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(convertButton)
                    .addComponent(fahrenheitLabel))
                .addContainerGap(21, Short.MAX_VALUE))
        );

        layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {convertButton, tempTextField});

	//Applet demo code below this line
	/////////////////////////////////////////////////////////////////////////
    }

    public void actionPerformed(java.awt.event.ActionEvent e) {
    }
   private void tempTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tempTextFieldActionPerformed
	 }
    private void convertButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_convertButtonActionPerformed
        //Parse degrees Celsius as a double and convert to Fahrenheit.
        int tempFahr = (int)((Double.parseDouble(tempTextField.getText())) * 1.8 + 32);
        fahrenheitLabel.setText(tempFahr + " Fahrenheit");
		}//GEN-LAST:event_convertBu
    
    /* One day, JApplet will make this method obsolete. */
    protected URL getURL(String filename) {
        URL codeBase = getCodeBase();
        URL url = null;

        try {
            url = new URL(codeBase, filename);
        } catch (java.net.MalformedURLException e) {
            System.out.println("Couldn't create image: badly specified URL");
            return null;
        }

        return url;
    }
    
    public static void main(String[] args) {
        Frame frame = new JFrame("Application: AppletDemo");

        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        AppletDemo applet = new AppletDemo(false);
        applet.init();
        frame.add(applet, BorderLayout.CENTER);
        frame.pack();
        frame.show();
    }
}

app.html (open this after compiling the java class)

<script src="http://www.java.com/js/deployJava.js"></script>
<script> 
    var attributes = { code:'AppletDemo.class', width:500, height:100} ; 
    var parameters = {codebase_lookup:'true'};
    deployJava.runApplet(attributes, parameters, '1.6'); 
</script>

Hope my experience helps someone.
- Jake

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.