desktop-java变成码_java.awt.desktop有问题

这意味着您使用的是安全管理器:

SecurityException

-如果存在安全管理器,并且它拒绝AWT权限(“SkyWistWOWE OutalRunBand”)权限,或者调用线程不允许创建子进程;并且不从Applet或Java Web启动应用程序中调用

如果这是一个applet,或者一个Java Web启动应用程序,就签上你的JAR。

更新

添加安全管理器以检测程序退出

错误的

. 有多种方法可以正确地做到这一点。在你的情况下,我想这是最合适的:

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {

@Override

public void run() {

closeFile();

}

));

Swing特定的解决方案是:

如果不需要执行额外操作,请使用

frame.setDefaultCloseAction(Frame.EXIT_ON_CLOSE)

使用

addWindowStateListener

并检查

WindowEvent.WINDOW_CLOSED

也就是说,两个注意事项:

不能长时间保存打开的文件。使用

try/catch/finally

在需要时打开和关闭它们。

如果您在某个时刻确实需要安全管理器,请确保重写

SecurityManager

这将检查是否可以打开链接。(不会告诉你是哪一个,这样你就不会想跳到这个解决方案上来,这是错误的)

总而言之,我想

setDefaultActionOnClose

,并在完成读/写后立即关闭每个文件。

更新2:

当你链接到你最初的问题描述你到底想要达到什么目标后,事情就发生了一些变化。你

试图阻止退出,所以您需要

安全管理员

. 这使得您可以重写

checkPermission

方法,并且不在其中执行任何操作(即不引发异常),至少在检查这些权限时(调用浏览时检查这些权限):

new AWTPermission("showWindowWithoutWarningBanner")

new FilePermission("<>", SecurityConstants.FILE_EXECUTE_ACTION)

更新3

下面是如何准确地重写该方法:

@Override

public void checkPermission(Permission permission) {

if (permission instanceof AWTPermission) {

if (permission.getName().equals("showWindowWithoutWarningBanner")) {

return;

}

}

if (permission instanceof FilePermission) {

if (permission.getActions().equalsIgnoreCase("execute")) {

return;

}

}

java.security.AccessController.checkPermission(permission);

}

(您可以不使用外部IF-S)

更新4

只有在您授予程序权限的情况下,上述方法才有效。否则,对于JVM来说,覆盖安全管理器是不允许被取消特权的,这是一种没有很好文档记录的行为。看看

this report

-这些评论说明了如何解决问题。

为了让你的生活更简单,你可以

@Override public void checkPermission(..)

方法体为空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值