在浏览器中调试 Java 小程序 - 可在 Eclipse 中运行,但不能在浏览器中运行
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6049124/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Debugging java applet in browser - works in Eclipse but not browser
提问by Still don't know everything
I have created an applet that opens a JFileChooser
to select a file on the click of a JButton
. 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.
我创建了一个小程序,它JFileChooser
可以通过单击JButton
. 当我在 Eclipse 中运行它时它工作正常。当我将它嵌入到带有小程序标记的 HTML 页面时,单击按钮时没有任何反应。
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?
关于为什么JFileChooser
没有在浏览器中打开的任何建议将不胜感激,但我的主要问题是我将如何调试它?我在 Google 上找不到任何关于如何将 Java 控制台添加到 Firefox 3.6 或 Chrome 的信息。有没有办法获得某种关于为什么 JFileChooser 没有打开的信息?
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?
所以控制台说有一个访问被拒绝的异常,我猜这是因为我没有“签署”小程序。就签署小程序而言,开发过程应该是怎样的?在我可以在浏览器中对其进行测试之前,我是否必须使用有效 CA 颁发的证书对其进行签名,或者您是否可以在测试时做一些简单的事情?
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-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,address=6789,suspend=n
0(EventQueue.java:85)
at java.awt.EventQueue.run(EventQueue.java:603)
at java.awt.EventQueue.run(EventQueue.java:601)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue.run(EventQueue.java:617)
at java.awt.EventQueue.run(EventQueue.java:615)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext.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)
回答by Kaj
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:
配置 Java 插件以允许远程调试。你在不同的平台上以不同的方式做这件事,但在 Windows 上会是这样。启动控制面板,选择java。单击周围直到找到 VM 选项,然后添加这些 VM 参数:
jarsigner jarfilename.jar yourcertificatename
6789 will be the debug port.
6789 将是调试端口。
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.
在 Eclipse 中启动远程调试是通过执行类似的操作来完成的。调试配置、远程 Java 应用程序、创建新配置。连接类型选择标准(Socket Attach),地址输入locahost,端口输入6789。
回答by Thorbj?rn Ravn Andersen
Consider enabling the Java Console which will allow you to see all the exception stack traces hopefully making it easier for you to debug.
考虑启用 Java 控制台,它允许您查看所有异常堆栈跟踪,希望能让您更轻松地进行调试。
Also "appletviewer" is designed for testing applets outside a browser including allowing you to see the exceptions.
“appletviewer”还设计用于在浏览器外测试小程序,包括允许您查看异常。
回答by ds_student
It's very likely that your SecurityManager isn't allowing it.
您的 SecurityManager 很可能不允许这样做。
In FireFox, you can check the java console by going to Tools > Java Console. Firefox should already have it set up.
在 FireFox 中,您可以通过转到“工具”>“Java 控制台”来检查 Java 控制台。Firefox 应该已经设置好了。
回答by Kyle
回答by Ritesh Sangwan
when you embed your applet in html page you have to sign the applet jar file See the documentation oracle docs
当您将小程序嵌入 html 页面时,您必须对小程序 jar 文件进行签名,请参阅文档 oracle docs
create your certificate then use then in command prompt type the following command
创建您的证书然后使用然后在命令提示符下键入以下命令
##代码##