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

 Java Discussion :

Interfaces Graphique: Reprise à zéro


Sujet :

Java

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut Interfaces Graphique: Reprise à zéro
    Bonsoir,bonjour à tous


    au cours de cette année, j'ai pu être initié à la programmation événementielle au travers de l'interface graphique swing de java avec netbeans.

    Sauf que, comme vous devez le savoir, netbeans facilite le placement des composants de façon graphique directement et génère un code correspondant.

    C'est clairement très pratique, mais ça me dérange quelque peu...en effet, on a utilisé cela au cours des 6 derniers mois et au final, on avait pas le contrôle total du code, c'est ce que je reproche principalement à netbeans (cad; à l'interface graphique de netbeans pour poser les composants).



    Du coup, moi ce que je voudrais faire, c'est reprendre toutes les notions de zéro, mais sans utiliser un outil comme netbeans, par exemple je voudrais directement pouvoir faire mes fenêtre via éclipse en écrivant moi même le code pour garder le contrôle.

    Question : Est-ce possible ? Si oui, pourriez-vous me diriger sur un tuto convenable ?


    Pour expliciter un peu plus mon problème, mon cours était principalement axé sur la gestion des events, donc le code qu'on a écrit correspondait en grande partie au listenner et actionPerformed...mais les composants en eux mêmes, leurs codes étaient générés par l'interface de netbeans (Matisse Amen j'ai fini par retrouver le nom xD)

    De ce point de vue là, je comprends pourquoi nos profs ont choisi cet outil, cela permettait de se concentrer sur les events plutôt que directement sur la partie graphique.

    Mais là, j'aimerais faire exactement le contraire.



    Merci pour votre aide !

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Au sujet de l'aspect général des interfaces graphiques Swing, il y a 3 aspects principaux :

    • les événements; Tu as déjà abordé cette partie, aidé par la palette de NetBeans. Regarder le code produit par la palette est un bon moyen de voir la base : comment enregistrer un évenement. Regarder la JavaDoc des composants te permettra de connaitre l'ensemble des évenements écoutables, et leur spécificité.
    • L'agencement des composants, et en particulier l'agencement automatique (les Layout Manager). Le tutoriel d'Oracle est à mon avis le plus complet.
    • Le rafraichissement de l'affichage. Les notions de validation (validate(), revalidate()), de redessin (repaint()) et la problématique de l'Event Distpach Thread. Je n'ai pas de tutoriel à te proposer, mais il y a beaucoup d'articles dans ce forum qui présentent ces aspects. On peut répondre à tes questions ici même. Il y a des tutoriels sur des aspects spécifiques comme le SwingWorker par exemple : tu peux consulter le sommaire sur le site à ce sujet.


    Il y a plein d'autres aspects bien sûr (en particulier quand on veut étendre l'interface a des notions plus graphiques), que tu découvriras par la suite petit à petit (tu pourras trouver de nombreux tutoriels spéciques, en cherchant sur la toile, ou dans le sommaire du forum Developpez pour certain, et dans des discussions spécifiques dans les forums Java de Developpez.net) :
    • les fenêtres (JFrame, JWindow...), fenêtres internes et bureau (JInternalFrame, JDesktopPane), les dialogues (JDialog, JOptionPane)
    • le look and feel, les notions d'UI
    • les entrées : des notions spécifiques concernant la gestion du clavier, les actions,
    • la gestion du drag and drop
    • Les décorations
    • Le contexte graphique (Graphics, Graphics2D), les composites, rendering hints, les notions de strokes (traits),
    • Java2D, java.awt.Shape (et les notions de paths (Path2D, GeneralPath...) en particulier), java.awt.geom (les Area en particulier (pour faire des CSG)), les transformées affines (AffineTransform)
    • La gestion des couleurs et des textures (Color, ColorModel, Paint...)
    • Les images (ImageIO, la notion d'observer (dans les méthodes de dessin d'image), la structure des images (Raster...), les transformations d'images (les filtres (ImageFilter), les opérateurs (ConvolveOp...)
    • ...


    Enfin, une consultation du tutoriel de Jean-Michel Doudoux est un bon moyen d'aborder Swing dans son ensemble.
    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
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Salut, merci pour ta réponse joel.

    Comme dit précédemment je reprends vraiment tout à la base.



    Voici le premier exemple du tutoriel dont tu m'as montré le lien.

    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
     
    import javax.swing.*;
    import java.awt.event.*;
     
    public class swing1 extends JFrame {
     
       public swing1() {
          super("titre de l'application");
     
          WindowListener l = new WindowAdapter() {
             public void windowClosing(WindowEvent e){
                System.exit(0);
             }
          };
     
          addWindowListener(l);
          setSize(200,100);
          setVisible(true);
       }
     
       public static void main(String [] args){
          JFrame frame = new swing1();
       }
    }
    On crée une fenêtre intitulé titre de l'application.
    Possédant un listener pour la fermeture de fenêtre.
    Sa taille de base étant 200 de long et 100 de haut.
    Et on fait en sorte que la fenêtre soit visible.



    Première remarque: lorsque je supprime le listener, je peux toujours fermer l'application en cliquant sur la croix rouge...pourquoi ?

    En fait, le fait de supprimer ce listener ne semble rien changer au comportement.

    La seule explication que je trouve à mon niveau serait que la classe JFrame possède déjà ce listener et que l'on en hérite en appelant le constructeur de la Jframe....mais dans ce cas là pourquoi le redéclarer ?



    Merci à vous.

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Amnael Voir le message
    Première remarque: lorsque je supprime le listener, je peux toujours fermer l'application en cliquant sur la croix rouge...pourquoi ?

    En fait, le fait de supprimer ce listener ne semble rien changer au comportement.
    Les listeners ne permettent que d'écouter des interactions utilisateurs ou des modifications d'état mais ne contrôlent absolument pas ce qui produit les évènements. Dans certains cas, on peut éventuellement avoir un contrôle par l'évènement lui-même, ou par la structure de l'écouteur, mais ceci est fait au cas par cas. Par exemple, on peut contrôler la fermeture d'une fenêtre :

    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
    public class DemoWindowEvent {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
     
    		// on ne peut supprimer le bouton de fermeture : on peut simplement dire qu'il ne fait rien d'autre
    		// que produire l'évenement
    		frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
     
    		// on enregistre un écouteur d'évenements
    		frame.addWindowListener(new WindowAdapter() {
     
    			/*
    			 * Cette méthode traite les évenements produits par le bouton de fermeture de la fenêtre
    			 */
    			@Override
    			public void windowClosing(WindowEvent e) {
    				// l'action du le bouton de fermeture ne fera rien d'autre que le code de cette méthode
    				closeIfConfirmed(frame);
    			}
     
    			/**
                             * Cette méthode traite les évenements produits lorsque la fenêtre est fermée
                             */
    			@Override
    			public void windowClosed(WindowEvent e) {
    				JOptionPane.showMessageDialog(null, "Fermée !");
    			}
     
    		});
     
    		JPanel panel = new JPanel(new GridBagLayout());
    		GridBagConstraints gbc = new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0);
     
    		JButton fermerButton1 = new JButton("Fermer directement");
    		fermerButton1.addActionListener(e-> frame.dispose());
    		panel.add(fermerButton1, gbc);
     
    		JButton fermerButton2 = new JButton("Fermer comme bouton fenêtre");
    		fermerButton2.addActionListener(e-> closeIfConfirmed(frame));
    		panel.add(fermerButton2, gbc);
     
    		frame.setContentPane(panel);
     
    		frame.setSize(300, 200);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
     
    	}
     
    	protected static void closeIfConfirmed(JFrame frame) {
    		if( JOptionPane.showConfirmDialog(frame, 
    				"Voulez-vous vraiment fermer la fenêtre ?", 
    				"Fermeture",
    				JOptionPane.OK_CANCEL_OPTION)==JOptionPane.OK_OPTION ) {
    			// alors je ferme la fenêtre
    			frame.dispose();
    		}
    	}
     
    }
    Tu vois que windowClosed() réagit à l'appel de dispose() sur la fenêtre, alors que windowClosing réagit à l'action sur le bouton de fermeture. Si on veut avoir le même comportement que le bouton "fermeture" dans un menu "Fermer l'application", il faudra mettre le même code qui est appelé dans windowClosing() dans l'actionPerformed() de l'ActionListener du menu.
    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.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/03/2004, 18h29
  2. interface graphique utilisateur, que faut-il utiliser?
    Par Missvan dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 01/03/2004, 12h18
  3. Application multiplateforme avec interface graphique
    Par TNorth dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 31/01/2004, 18h55
  4. [Kylix] Interface graphique pour lognes de commande linux
    Par lecharcutierdelinux dans le forum EDI
    Réponses: 6
    Dernier message: 29/08/2003, 10h20
  5. plugin interface graphique
    Par jocelyn dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 13/08/2003, 09h49

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