在浏览器中调试java applet – 在Eclipse中工作但不在浏览器中工作

我创建了一个applet,它打开一个JFileChooser来选择一个JButton点击的文件。 当我在Eclipse中运行它时它工作正常。 当我将它嵌入带有applet标签的HTML页面时,单击按钮时没有任何反应。

关于为什么JFileChooser不能在浏览器中打开的任何建议都会受到赞赏, 但我的主要问题是如何调试这个? 我无法在Google上找到有关如何将Java控制台添加到Firefox 3.6或Chrome的任何内容。 有没有办法获得有关JFileChooser无法打开的原因的某种信息?

调试在下面的评论中回答

所以控制台说有一个访问被拒绝的exception,我猜是因为我没有“签名”applet。 在签署applet时,开发过程应该是什么? 在我可以在浏览器中测试之前,是否必须使用由有效CA颁发的证书对其进行签名,或者在测试时是否可以执行一些简单的操作?

这是我的代码:

 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; } } 

这是例外:

 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.(JFileChooser.java:333) at javax.swing.JFileChooser.(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) 

只是旁注。 远程调试applet相当容易。

配置Java插件以允许远程调试。 你可以在不同的平台上以不同的方式实现它,但在Windows上它会是这样的。 启动控制面板,选择java。 单击“开”直到找到VM选项,然后添加以下VM参数:

 -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,address=6789,suspend=n 

6789将是调试端口。

在Eclipse中启动远程调试是通过执行类似的操作来完成的。 调试配置,远程Java应用程序,创建新配置。 选择标准(套接字连接)作为连接类型,输入locahost作为地址,输入6789作为端口。

考虑启用Java控制台,这将允许您查看所有exception堆栈跟踪,希望您可以更轻松地进行调试。

此外,“appletviewer”旨在测试浏览器之外的applet,包括允许您查看exception。

您的SecurityManager很可能不允许它。

在FireFox中,您可以转到“工具”>“Java控制台”来检查Java控制台。 Firefox应该已经设置好了。

实现日志记录解决方案(例如Log4j )是另一个值得关注的选项。 一些关于如何启动和运行的快速教程 。

当您在html页面中嵌入applet时,您必须在applet jar文件中签名。请参阅文档oracle docs

创建您的证书然后使用然后在命令提示符下键入以下命令

 jarsigner jarfilename.jar yourcertificatename