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_ *常量。合理?
答案 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检查退出权限是很好的 - 至少它使这很容易找到! :)