3

バックグラウンド

Nailgunは、VMの起動時間を短縮する目的で、Javaアプリケーションをサーバーに送信するためのユーティリティ(server-protocol-client)です。

問題

さまざまな基本的なスイングアプリケーションは、ネイルガンを介して起動できません。setDefaultCloseOperationを呼び出すと、アプリケーションは「NG1」と「NG1.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ボタンが機能する)ことを言及するのは適切だと思います(おそらくネイルガンはこれをどうにかして行いますか?)。

私はこの時点でかなり混乱しています、そしてどんな提案も役に立つでしょう。

アップデート:

また、キーリスナーは適切に構成されていないKeyEventsを取得しているようです。KeyEvent.VK_ [0-9]で大文字と小文字を区別しても数値キーは通過しますが、VK_ESCAPEやVK_Qなどのキーは一致していないようです。KeyEvent.VK_ *定数ではなく、VMで生成された「生の」コードを調べて、それと照合する必要があります。適正?

4

1 に答える 1

3

ネイルガンの作者はこちら。

アンドリューの本能はまさに正しい。Nailgunは、SecurityManagerを使用して、1つのクラスのSystem.exit()がNailgunVM全体を強制終了するのを防ぎます。

デフォルトの閉じる操作をEXIT_ON_CLOSEに設定すると、ウィンドウを閉じるとVMがシャットダウンされ、今後の呼び出しが防止されます。これは防止したくないと思います。

JFrameのopenjdkソースを簡単にチェックすると、setDefaultCloseOperation(EXIT_ON_CLOSE)を呼び出すときに、System SecurityManagerのcheckExit()メソッドが呼び出されることが確認されます。これはあなたのアプリが死にかけているところです。結果として、com.martiansoftware.nailgun.NGExitExceptionが表示される場合もあります。

JFrameが終了しようとするときではなく、デフォルトの閉じる操作を設定するときに終了許可をチェックするのは素晴らしいことです-少なくともこれを見つけやすくしました!:)

于 2012-09-09T23:44:30.890 に答える