Debugging java applet in browser - works in Eclipse but not browser
Solution 1
Just a side note. It's rather easy to remote debug applets.
Configure the Java plugin to allow remote debugging. You do it in different ways in different platforms, but it will be something like this on windows. Start the control panel, select java. Click around till you find VM options, and add these VM arguments:
-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,address=6789,suspend=n
6789 will be the debug port.
Starting the remote debugging in Eclipse is done by doing something similar to. Debug configurations, Remote Java Application, Create a new configuration. Select Standard (Socket Attach) as connection type, and enter locahost as address and 6789 as port.
Solution 2
Consider enabling the Java Console which will allow you to see all the exception stack traces hopefully making it easier for you to debug.
Also "appletviewer" is designed for testing applets outside a browser including allowing you to see the exceptions.
Solution 3
It's very likely that your SecurityManager isn't allowing it.
In FireFox, you can check the java console by going to Tools > Java Console. Firefox should already have it set up.
Still don't know everything
Updated on June 04, 2022Comments
-
Still don't know everything about 2 years
I have created an applet that opens a
JFileChooser
to select a file on the click of aJButton
. It works fine when I run it in Eclipse. When I embed it in an HTML page with the applet tag nothing happens when I click the button.Any suggestions as to why the
JFileChooser
does not open in the browser would be appreciated, but my main question is how would I debug this? I haven't been able to find anything on Google about how to add a Java console to Firefox 3.6 or Chrome. Is there a way to get some kind of information as to why the JFileChooser does not open?Debugging answered in comment below
So the console says there is an access denied exception, which I'm guessing is because I have not "signed" the applet. What should the development process be as far as signing an applet goes? Do I have to sign it with a certificate issued by a valid CA before I can test it in a browser, or is there some simple thing you can do while just testing?
Here is my code:
package com.putapplet; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import java.net.URL; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.SwingUtilities; @SuppressWarnings("serial") public class PutToS3Applet extends JApplet { private static long maxFileSizeInBytes = 1048576; private static String listenerUrl = "xxx"; private String listenerQueryString; private String signedPutUrl; private JProgressBar progressBar; private JButton button; private JLabel messageField; public void init() { setMaxFilesize(1); try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { createGUI(); } }); } catch (Exception e) { System.err.println("createGUI didn't complete successfully"); } } private void createGUI() { button = new JButton("Choose File..."); button.addActionListener(new ButtonListener()); progressBar = new JProgressBar(0, 100); progressBar.setStringPainted(true); messageField = new JLabel(); //messageField.setPreferredSize(new Dimension(300, 20)); FlowLayout layout = new FlowLayout(); layout.setAlignment(FlowLayout.LEFT); JPanel topPanel = new JPanel(); topPanel.setLayout(layout); JPanel bottomPanel = new JPanel(); bottomPanel.setLayout(layout); topPanel.add(button); topPanel.add(progressBar); bottomPanel.add(messageField); setLayout(new GridLayout(2,1)); add(topPanel); add(bottomPanel); } class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent ae) { JFileChooser fileChooser = new JFileChooser(); int showOpenDialog = fileChooser.showDialog(null, "Upload File"); if (showOpenDialog != JFileChooser.APPROVE_OPTION) return; final File fileToUpload = fileChooser.getSelectedFile(); if (fileToUpload.length() > PutToS3Applet.maxFileSizeInBytes) { messageField.setText("Your file must be smaller than " + getHumanReadableMaxFilesize()); return; } listenerQueryString = "query[filename]=" + fileToUpload.getName(); //get signed PUT url for s3 try { URL listener = new URL(listenerUrl + listenerQueryString); BufferedReader in = new BufferedReader(new InputStreamReader(listener.openStream())); signedPutUrl = in.readLine().replace("http://", "https://"); messageField.setText(signedPutUrl); } catch (Exception e) { messageField.setText("Oops, there was a problem connecting to the server. Please try again."); e.printStackTrace(); } } } private String getHumanReadableMaxFilesize() { return Long.toString((PutToS3Applet.maxFileSizeInBytes / 1024 / 1024)) + "MB"; } private void setMaxFilesize(int sizeInMegaBytes) { PutToS3Applet.maxFileSizeInBytes = PutToS3Applet.maxFileSizeInBytes * sizeInMegaBytes; } }
Here is the exception:
Exception in thread "AWT-EventQueue-1" java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374) at java.security.AccessController.checkPermission(AccessController.java:546) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285) at java.lang.System.getProperty(System.java:650) at javax.swing.filechooser.FileSystemView.getHomeDirectory(FileSystemView.java:393) at javax.swing.plaf.metal.MetalFileChooserUI.installComponents(MetalFileChooserUI.java:253) at javax.swing.plaf.basic.BasicFileChooserUI.installUI(BasicFileChooserUI.java:136) at javax.swing.plaf.metal.MetalFileChooserUI.installUI(MetalFileChooserUI.java:126) at javax.swing.JComponent.setUI(JComponent.java:662) at javax.swing.JFileChooser.updateUI(JFileChooser.java:1763) at javax.swing.JFileChooser.setup(JFileChooser.java:360) at javax.swing.JFileChooser.<init>(JFileChooser.java:333) at javax.swing.JFileChooser.<init>(JFileChooser.java:286) at com.putapplet.PutToS3Applet$ButtonListener.actionPerformed(PutToS3Applet.java:82) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6289) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6054) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4652) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4482) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Component.dispatchEvent(Component.java:4482) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644) at java.awt.EventQueue.access$000(EventQueue.java:85) at java.awt.EventQueue$1.run(EventQueue.java:603) at java.awt.EventQueue$1.run(EventQueue.java:601) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) at java.awt.EventQueue$2.run(EventQueue.java:617) at java.awt.EventQueue$2.run(EventQueue.java:615) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.awt.EventQueue.dispatchEvent(EventQueue.java:614) 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)
-
Kyle about 13 yearsFeel free to add some code if you would like some input on why your code is not working here...
-
Still don't know everything about 13 yearsI found the answer to how to debug, at least on Ubuntu: Run the command jcontrol. On the Advanced tab expand Java console and select Show console. This will cause the Java console to open up whenever an applet runs in your browser
-
Oli almost 11 yearsMaybe you got the same problem: stackoverflow.com/questions/17786669/…
-
-
mjaggard over 10 yearsThis doesn't seem to work for me on Java 1.7 update 51.
-
Udo Borkowski almost 8 yearsTo configure the Java plugin to allow remote debugging on Mac OSX (e.g. for Safari): System Preferences > Java (the "Java Control Panel” opens). “Java” tab > View… (the “Java Runtime Environment Settings” window opens). In the table find the proper line, click into the “Runtime Parameters” field and add the VM arguments given above.