3

背景

Nailgun是一个实用程序(服务器协议客户端),用于将 Java 应用程序发送到服务器,目的是减少 VM 的启动时间。

问题

一个不同的基本摆动应用程序无法通过 nailgun 启动。调用 setDefaultCloseOperation 时,应用程序在标有“NG 1”和“NG 1.1”的行之间退出。服务器打印: NGSession 2: 127.0.0.1: org.genja.volumeslider.Aframe exited with status 0
如果我注释掉 JFrame 的关闭操作方法,框架显示它应该。

代码

   package org.genja.volumeslider;
   import java.awt.*;
   import java.awt.event.*;
   import javax.swing.*;
   import javax.swing.event.*;
   import javax.imageio.*;
   import java.util.*;
   import java.io.*;

   public class Aframe {
       public static void main(String[] argv) {
           System.out.println("NG 1");
           JFrame frame = new JFrame("VolumeSlider");
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           System.out.println("NG 1.1");
           frame.setPreferredSize(new Dimension(64,200));
           frame.setResizable(false);

           JSlider  slider = new JSlider(JSlider.VERTICAL, 0, 55, 12);

           frame.add(slider, BorderLayout.CENTER);
           //Display the window.
           frame.pack();
           frame.setVisible(true);
       }
   }

问题

这可能是什么原因造成的?这是 nailgun 中的错误,还是我应该使用其他方式在 swing/java 中启用关闭按钮?我认为有必要提到应用程序确实退出而没有问题(x 按钮有效),即使该类是通过 nailgun 运行的,也没有设置默认的关闭操作(也许 nailgun 以某种方式这样做?)。

在这一点上我很困惑,任何建议都会很有用。

更新:

keylistener 似乎也获得了未正确配置的 KeyEvents。我遇到数字键在使用 KeyEvent.VK_[0-9] 切换时仍然可以通过,但 VK_ESCAPE 和 VK_Q 等键似乎不匹配。我可能应该只查看它们在该 VM 中生成的“原始”代码并与之匹配,而不是 KeyEvent.VK_* 常量。合理的?

4

1 回答 1

3

钉枪作者在这里。

安德鲁的直觉是完全正确的。Nailgun 使用 SecurityManager 来防止一个类的 System.exit() 杀死整个 Nailgun VM。

如果您将默认关闭操作设置为 EXIT_ON_CLOSE 则关闭窗口将关闭 VM 并阻止将来的调用,我猜您不想阻止。

快速检查 JFrame 的 openjdk 源代码可以确认在您调用 setDefaultCloseOperation(EXIT_ON_CLOSE) 时调用了 System SecurityManager 的 checkExit() 方法。这就是你的应用程序正在消亡的地方。结果,您可能还会看到 com.martiansoftware.nailgun.NGExitException。

当您设置默认关闭操作而不是尝试退出时,JFrame 会检查退出权限,这很好 - 至少它很容易找到!:)

于 2012-09-09T23:44:30.890 回答