2013-05-13 9 views
5

Questo codice funziona in tutti i modi, ma ora non si chiude completamente, sembra bloccarsi mentre colpisco la "X" sulla finestra. Dopo aver colpito vicino, se minimizzo lo schermo e poi lo ingrandisco, è solo nero. L'unico modo per farla chiudere completamente è uscire da Eclipse, il mio IDE.Jframe non si chiude su "X"

Prima di questo ho avuto un aspetto diverso. Ho rubato del codice per la GUI, l'ho fatto in netbeans per farlo sembrare migliore di quanto potessi fare a mano. Quindi immagino che abbia a che fare con l'aspetto "nimbus", ma forse non sto chiudendo correttamente altri oggetti e ora è un problema?

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

Classe Automator corsa e vicino

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

EDIT: La piccola scatola rossa in eclissi lo chiude, ma ancora di per sé non è così. vicino azione "DISPOSE_ON_CLOSE" invece di EXIT_ON_CLOSE (suggerimento generale)

Hovercraft pieno di anguille commento

+0

Che dire quando si preme il 'X' nella console Eclipse? – CodyBugstein

+0

Non sai cosa intendi, intendi letteralmente quando chiudo Eclipse? Si spegne e il programma si chiude completamente. Il problema è quando lo ho come un file .jar eseguibile, non c'è modo di chiuderlo. Non viene nemmeno visualizzato nel task manager. –

+0

Voglio dire [QUESTO] (http://imgur.com/7QWidY2) piccolo 'X' – CodyBugstein

risposta

5

Set di default è molto utile. Se si dispone di tutte le finestre undisposed o thread non demone, l'applicazione non terminerà

Verificare la presenza di tutti i frame attivi .. utilizzare Frame.getFrames() Se tutti i Windows/frame vengono smaltiti, poi di debug per verificare eventuali non-daemon le discussioni che sono ancora in esecuzione

una soluzione crudele ma efficace sarebbe System.exit(0)

classe dovrebbe implementare WindowListener

// Use this method 
public void windowClosed(WindowEvent e){ 
    System.exit(0); 
} 
+0

Sono una persona crudele, ma a volte elegante. Quindi, dai commenti di Eels e degli altri, dice che ho bisogno di contrassegnare qualcosa come un demone con 'isDaemon (true)'? Oppure, una volta che effettivamente chiamerò il mio metodo OnClose, il mio processo Daemon (tastiera globale e ascoltatori del mouse) verrà chiuso e il mio programma morirà e non sarà in modalità zombi? –

+0

Non penso che sia necessario preoccuparsi dei thread, il processo sarà blindato. se hai i file aperti potrebbe essere una buona idea chiuderli e chiuderli, a parte che System.exit (0) va bene – tgkprog

+0

vedi http://docs.oracle.com/javase/6/docs/api/java/lang /Runtime.html#exit%28int%29 – tgkprog

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

     } 
0

Speculativo. Avere classi statiche (swing) potrebbe tenere le cose, per Nimbus. Poiché l'uso statico spesso non è così bello, prova a eliminarli, come campi dell'applicazione JFrame.

2

ho intenzione di azzardare un'ipotesi che questa riga di codice

while(true) {} 

potrebbe essere il tuo colpevole.