IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques en Java Discussion :

Comportement identique => Action


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Par défaut Comportement identique => Action
    Bonjour à tous,

    Je suis en train de développer une application et je voudrais avoir le même comportement en cliquant sur la croix rouge de la fenêtre que sur l'item 'Quitter' de la barre de menu de la fenêtre que j'ai.

    J'y suis arrivé, mais à quel prix... Pourriez vous m'aider à améliorer mon code (avec une Action par exemple ?)

    De plus, j'aimerais mettre un raccourcis sur l'item 'Quitter' qui produirait lui aussi le même résultat que l'item 'Quitter' ou la croix rouge.

    Merci d'avance à tous pour vos réponses,

    Tolliob

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
     
    public class MyWindowListener implements WindowListener{
    		@Override
    		public void windowOpened(WindowEvent e) {}
     
            @Override
            public void windowClosing(WindowEvent e) {
            	ESSAI.action();
            }
     
    		@Override
    		public void windowClosed(WindowEvent e) {}
     
    		@Override
    		public void windowIconified(WindowEvent e) {}
     
    		@Override
    		public void windowDeiconified(WindowEvent e) {}
     
    		@Override
    		public void windowActivated(WindowEvent e) {}
     
    		@Override
    		public void windowDeactivated(WindowEvent e) {}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
     
    public class MyJFrame extends JFrame implements ActionListener {
    	private static final long serialVersionUID = 1L;
     
    	public MyJFrame() {
    		// Proprietes de la fenetre
    		int width = 400;
    		int height = 200;
    		this.setTitle("Essai");
    		this.setBounds(100, 100, width, height);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		// Definition d'un item
    		JMenuItem quit = new JMenuItem("Quitter");
    		quit.addActionListener(this);
     
    		// Definition d'un menu
    		JMenu action = new JMenu("Action");
    		action.add(quit);
     
    		// Definition d'une JMenuBar
    		JMenuBar menuBar = new JMenuBar();
    		this.setJMenuBar(menuBar);
    		menuBar.add(action);
     
    		// Ajout d'un ecouteur
    		this.addWindowListener(new MyWindowListener());
    	}
     
    	public static void action() {
    		System.out.println("Trop top !");
    	}
     
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		ESSAI.action();
    		this.dispose();
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class Essai {
    	public static void main(String[] args) {
    		MyJFrame fenetre = new MyJFrame();
    		fenetre.setVisible(true);
    	}
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    En fait la fermeture d'une fenêtre :

    • est déclenchée par l'appel de la méthode dispose() ;
    • dépendant du paramètre defaultCloseOperation (qui détermine ce qu'il se passe quand on ferme la fenêtre) ;
    • un clic sur la croix déclenche l'appel de la méthode/évenement windowClosing().


    Donc en résumé,

    • on met le code qu'on veut faire quelque soit la façon de fermer la fenêtre dans la méthode windowClosed() ;
    • on met le code qu'on veut faire quand on clique sur la croix dans la méthode windowClosing() (en ayant pris soin d'avoir mis comme defaultCloseOperation DO_NOTHING_ON_CLOSE, sinon ça va faire autre chose : sauf si on veut appeller dispose() dans windowClosing() : on peut utiliser directement DISPOSE_ON_CLOSE, qui fait la même chose).
    • et dans les codes qui doivent fermer la fenêtre (bouton, menu, autres...), on appelle dispose().


    Eventuellement, tu peux également utiliser la même instance d'action qui appelle close pour les menus, boutons, etc... au lieu d'utiliser des action listeners.


    Classe pour illustrer tout ceci : SampleFrame.java
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Par défaut
    Merci !!!!

    Ton exemple est super cool !

    N'ayant pas java 8, j'ai modifié les lambdas pour que mon petit java 7 accepte le tout.


    Vraiment merci.



    Je me permet de continuer le fil en voulant qu'un raccourci (du genre ctrl + q) fasse la même chose en sortant de la fenêtre...

    Je sais que sur mon mac, je peux clore une application sur le dock en lui disant "Quitter". On peut gérer ce genre d'évènement ?

    Encore merci pour l'aide !

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Il y a plusieurs façons de gérer le déclenchement d'action sur appui de touches (Les mnémoniques associées aux actions (voir setMnemonic(...)), qui sont plus destinés à avoir une alternative clavier pour l'accessibilité à une action souris comme un menu par exemple), les accelerators (voir setAccelerator()) qui permetten d'avoir des touches de raccourcis clavier (qu'on voit dans le texte du menu), les key bindings (voir getInputMap() et getActionMap()...registerKeyboardAction()... sur les JComponent()) mais qui sont plutôt pour manipuler un formulaire ou des composants dans un panel ou une fenêtre (par exemple, les actions d'un éditeur), et le faire à la main avec un KeyListener.

    Mais le plus simple dans ton cas, il me semble, est d'utiliser un KeyEventDispatcher et de l'enregistrer à l'ouverture de ta fenêtre avec keyboardFocusManager.addKeyEventDispatcher(java.awt.KeyEventDispatcher). J'en ai parlé justement il y a peu dans cette discussion.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par tolliob Voir le message
    N'ayant pas java 8, j'ai modifié les lambdas pour que mon petit java 7 accepte le tout.
    Peut-être peux-tu mettre cette version en pièce jointe ici, afin que d'autres qui seraient intéressés par le même exemple compatible Java 7, en profitent ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Peut-être peux-tu mettre cette version en pièce jointe ici, afin que d'autres qui seraient intéressés par le même exemple compatible Java 7, en profitent ?
    En voici une version tronqué de ce que tu m'a envoyé. Il n'est pas difficile de compléter avec la classe interne pour ceux que ça intéresse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.InputEvent;
    import java.awt.event.KeyEvent;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.KeyStroke;
     
     
    @SuppressWarnings("serial")
    public class SampleFrame extends JFrame {
     
    	public SampleFrame() {
    		super("Demo fermeture");
     
    		// menu
    		setJMenuBar(createMenu());
     
    		// bouton
    		getContentPane().add(createButtonPanel());
     
    		// fermeture par le bouton croix
    		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    		addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowClosing(WindowEvent e) {
    				System.out.println("Action croix de la fenÍtre");
    				// inutile de mettre un appel ‡ dispose ici
    			}
     
    			@Override
    			public void windowClosed(WindowEvent e) {
    				System.out.println("Closed...");
    				doOnClose();
    			}
    		});
     
    		setMaximumSize(new Dimension(200,200));
    		setSize(100,100);
    		setLocationRelativeTo(null);
    	}
     
    	protected void doOnClose() {
    		/**
                     * Cette mÈthode contient le code qu'on veut faire lorsqu'on ferme la fenêtre
                     * quelque soit la manière
                     * @return
                     */
    		System.out.println("La fenêtre a été fermée...");
    	}
     
    	private JMenuItem createCloseMenu() {
    		JMenuItem menu = new JMenuItem("Fermer fenêtre");
    		menu.addActionListener(new ActionListener() {
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				System.out.println("Action menu");
    				dispose();
    			}
    		});
    		return menu;
    	}
     
    	private JMenuBar createMenu() {
    		JMenuBar menuBar = new JMenuBar();
    		JMenu menu = new JMenu("Menu");
    		menu.setMnemonic(KeyEvent.VK_M);
    		menuBar.add(menu);
    		menu.add(createCloseMenu());
    		return menuBar;
    	}
     
    	private JButton createCloseButton() {
    		JButton button = new JButton("Fermer fenêtre");
    		button.addActionListener(new ActionListener() {
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				System.out.println("Action bouton");
    				dispose();
    			}
    		});
    		return button;
    	}
     
    	private JPanel createButtonPanel() {
    		JPanel panel = new JPanel();
    		panel.setLayout(new BorderLayout());
    		panel.add(createCloseButton(), BorderLayout.NORTH);
    		return panel;
    	}
     
    	public static void main(String[] args) {
    		SampleFrame frame = new SampleFrame();
    		frame.setVisible(true);	
    	}
     
    }

Discussions similaires

  1. Séparer les actions des divs identiques
    Par Boris56 dans le forum jQuery
    Réponses: 10
    Dernier message: 26/07/2010, 14h30
  2. Comportement classe / vue / contrôleur / action
    Par SpaceInvader dans le forum Zend Framework
    Réponses: 2
    Dernier message: 21/06/2010, 11h28
  3. Actions identiques pour calques différents ?
    Par 0x66656C6978 dans le forum jQuery
    Réponses: 2
    Dernier message: 14/06/2009, 11h19
  4. Réponses: 1
    Dernier message: 13/06/2007, 11h23
  5. [Struts]2 Threads identiques quand j'appelle une action
    Par seb55555 dans le forum Struts 1
    Réponses: 4
    Dernier message: 03/05/2005, 16h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo