5

このコードはあらゆる方法で機能しますが、完全には閉じず、ウィンドウの「X」をクリックするとハングするようです。閉じた後、画面を最小化してから最大化すると、真っ黒になります。完全に閉じる唯一の方法は、私の IDE である Eclipse を終了することです。

これ以前は、見た目と感触が異なっていました。GUI のコードをいくつか盗みました。手動で行うより見栄えを良くするために、netbeans で作成しました。だから私はそれが「ニンバス」のルックアンドフィールに関係していると思いますが、おそらく他のオブジェクトを適切に閉じていないので、それが問題になっていますか?

static CLUtilCompact app = null; // this
static AuxPPanel aux = null; // JPanel
static StatusPanel stat = null; // JPanel
static UserActPanel user = null; // JPanel
static InputPanel input = null; // JPanel
static Automator auto = null;   
        //public class Automator extends Thread 
       //   implements NativeMouseInputListener, NativeKeyListener  

public CLUtilCompact() 
{
    aux = new AuxPPanel();
    stat = new StatusPanel();
    user = new UserActPanel();
    auto = new Automator();
    input = new InputPanel();
    GlobalScreen.getInstance().addNativeKeyListener(auto);
    GlobalScreen.getInstance().addNativeMouseListener(auto);
    GlobalScreen.getInstance().addNativeMouseMotionListener(auto);
    auto.start();
}

public static void main(String[] args) 
{
    // Create the App, and panels
    app = new CLUtilCompact();
    // Let the panels have access to app now
    aux.setApp(app);
    stat.setApp(app);
    user.setApp(app);
    auto.setApp(app);
    app.updateOutput("Started");
    app.updateStatus("Started");
    input.setApp(app);

    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(CLUtilCompact.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(CLUtilCompact.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(CLUtilCompact.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(CLUtilCompact.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            app.setDefaultCloseOperation(EXIT_ON_CLOSE);
            app.setAlwaysOnTop(true);
            app.setVisible(true);
        }
    });
}

クラス Automator の実行と終了

public void run()
{
    try // to make the Global hook
    {
        GlobalScreen.registerNativeHook();
    }
    catch (NativeHookException ex){theApp.updateOutput("No Global Keyboard or Mouse Hook");return;}
    try // to create a robot (can simulate user input such as mouse and keyboard input)
    {
        rob = new Robot();
    } 
    catch (AWTException e1) {theApp.updateOutput("The Robot could not be created");return;}

    while(true) {}
}

public void OnClose()
{
    GlobalScreen.unregisterNativeHook();
}

編集:日食の小さな赤いボックスはそれを閉じますが、それでもそれ自体では閉じません。

4

6 に答える 6

7

デフォルトの閉じるアクションを EXIT_ON_CLOSE ではなく "DISPOSE_ON_CLOSE" に設定します (一般的なヒント)

Hovercraft Full Of Eels のコメントは非常に役に立ちます。未処理のウィンドウまたは非デーモン スレッドがある場合、アプリケーションは終了しません。

すべてのアクティブなフレームを確認します。Frame.getFrames() すべてのウィンドウ/フレームが破棄された場合は、デバッグして、実行中の非デーモン スレッドを確認します。

残酷だが効果的な解決策の1つはSystem.exit(0)

クラスは WindowListener を実装する必要があります

// Use this method
public void windowClosed(WindowEvent e){
    System.exit(0);
}
于 2013-05-17T15:54:28.520 に答える
2

このコード行が

while(true) {}

あなたの犯人かもしれません。

于 2013-05-22T20:40:59.310 に答える
1

EXIT_ON_CLOSE ではなく、デフォルトのクローズ アクションを DISPOSE_ON_CLOSE に設定してください。

frameName.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

詳細情報: Java Swing の基本、アプリケーション/JFrame を終了して破棄する方法

于 2013-05-22T16:17:38.737 に答える
0
 http://stackoverflow.com/questions/2352727/closing-jframe-with-button-click

   JButton button = new JButton("exit");
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
   frame.setVisible(false);
            frame.dispose();

        }
于 2013-05-22T10:02:38.827 に答える
0

投機的。Nimbus の場合、静的 (swing) クラスを持つことで、物事を保持できます。static を頻繁に使用するのも見栄えが悪いため、JFrame アプリのフィールドとして使用しないようにしてください。

于 2013-05-22T10:40:10.177 に答える