2016-08-22 3 views
0

J'ai créé un JFrame avec JDesktopPane, dans lequel j'appelle JInternalFrame. Maintenant, je veux fermer ce cadre interne en appuyant sur la touche d'échappement.Comment fermer JInternalFrame en appuyant sur la touche d'échappement?

J'ai essayé 2-3 façons, mais pas de sortie.

  1. Je l'ai fait en utilisant le code ci-dessous:

    public static void closeWindow(JInternalFrame ji){ 
        ActionListener close=New ActionListener(){ 
    
        public void actionPerformed(ActionEvent e){ 
         ji.dispose(); 
        } 
    }; 
    

    Quand j'ai appelé méthode ci-dessus de mon constructeur de cadre interne de la classe en fournissant son objet, j'ai pu fermer. Mais quand j'écris d'autres lignes de code au constructeur. L'appel de méthode ci-dessus ne fonctionne pas. Aidez-moi, s'il vous plaît. Je n'arrive pas à trouver le problème dans le code.

  2. J'ai également essayé d'ajouter KeyListener à l'image interne, donc je peux travailler avec des coups de touches, mais cela ne fonctionne pas non plus.
  3. Encore une fois j'ai essayé de setMnemonic à bouton réchappés comme ci-dessous:

    jButton1.setMnemonic(KeyEvent.VK_ESCAPE); 
    

    mais donne également aucune sortie.

+1

Votre 2ème approche semble être le chemin à parcourir. Vous avez peut-être ajouté le KeyListener incorrectement. – byxor

+1

Ne pas (essayer de) poster des captures d'écran de votre code! Juste poster le code lui-même. Pour une meilleure assistance plus tôt, publiez un [MCVE] ou [Short, Self Contained, Example correct] (http://www.sscce.org/). –

+0

Cette photo de votre écran avec du code est totalement illisible. – Jesper

Répondre

0

Vous devez implémenter l'interface KeyListener, ou ajouter un qui est anonyme. Dans cet exemple, je l'ai juste implémenté.

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 

public class JInternalFrame extends JFrame implements KeyListener { 

    public JInternalFrame() 
    { 
     super(); 


     // other stuff to add to frame 
     this.setSize(400, 400); 
     this.setVisible(true); 

     this.addKeyListener(this); 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
     // Don't need to implement this 


    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     if(e.getKeyCode() == KeyEvent.VK_ESCAPE) { 
      System.exit(0); //Change this to dispose or whatever you want to do with the frame 
     } 

    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     //Dont need to implement anything here 

    } 

    public static void main(String[] args) 
    { 
     JInternalFrame frame = new JInternalFrame(); 
    } 

} 

Maintenant, si cela est un JFrame interne tel que mentionné, il est probablement préférable de mettre en œuvre le keyListener dans le JDesktopPane et appeler la méthode Éliminez sur le JInternalFrame après avoir appuyé sur la mise en œuvre échapper au lieu de keyListener dans ce cadre. Tout dépend du composant d'interface graphique qui a le focus d'entrée.

+0

Merci. Cette solution fonctionne bien pour jinternalframe seulement s'il n'y a aucun composant présent dedans. Quand j'ajoute des composants comme jlabel, jtextfield, jbutton à jinternalframe, le keylistener ne fonctionne pas. Je pense que d'autres composants présents dans jinternalframe obtiennent l'attention, donc il n'est pas capable de détecter l'événement keypressed pour jinternalframe. Pouvez-vous s'il vous plaît m'aider à résoudre ce problème? – user6725738