【问题标题】:Java Nailgun fails to launch a simple swing applicationJava Nailgun 无法启动一个简单的 Swing 应用程序
【发布时间】:2012-08-27 06:46:55
【问题描述】:

背景

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

【问题讨论】:

  • 它是否适用于frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);?它可能与阻止“钉枪”JVM 结束的SecurityMaager 有关。
  • 这当然有帮助。我希望我明白发生了什么,但感谢您的回答,我至少现在可以继续前进,稍后再尝试阅读有关该问题的信息。
  • 如果它有效,我可以解释。有用吗?
  • 是的。该课程以“正常”方式启动。

标签: java swing


【解决方案1】:

钉枪作者在这里。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2012-03-21
    相关资源
    最近更新 更多