Java Nailgun无法启动简单的swing应用程序

时间:2012-09-02 00:23:32

标签: java swing

背景

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的close-operation方法,那么框架就会显示出来。

代码

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

问题

导致这种情况的原因是什么?这是一个钉枪的错误,还是我应该使用其他方式启用swing / java中的关闭按钮?我认为提及应用程序确实退出没有问题(x按钮工作)是相关的,即使该类通过nailgun运行,而没有设置默认的关闭操作(也许钉枪会以某种方式做到这一点?)。

我现在相当困惑,任何建议都会有用。

更新

似乎keylistener获取未正确配置的KeyEvent。我正在经历使用KeyEvent.VK_ [0-9]切换时数字键仍然通过,但VK_ESCAPE和VK_Q等键似乎不匹配。我应该只看一下他们在那个VM中生成的“原始”代码并与之匹配,而不是KeyEvent.VK_ *常量。合理?

1 个答案:

答案 0 :(得分:3)

Nailgun作者在这里。

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

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

快速检查JFrame的openjdk源确认在调用setDefaultCloseOperation(EXIT_ON_CLOSE)时调用System SecurityManager的checkExit()方法。这是您的应用程序即将死亡的地方。您可能还会看到com.martiansoftware.nailgun.NGExitException。

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