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

AWT/Swing Java Discussion :

Un JMenuBar avec drag zone et icones


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Par défaut Un JMenuBar avec drag zone et icones
    Bonjours,

    J'ai fait une application MDI avec des Jinternalframes. mais comme je veux alleger les fenetres child, ausi j'ai supprimé le title bar et ramene le drag and drop sur le JmenuBar. Tout est bien sauf que je n'ai plus les 3 icones de fermutre/restauration/minimize que l'on trouve a droite de toutes fenetres.
    Je m'en sors en mettant un exit dans le menu qui trigger un dispose de la fenetre. Hors j'ai toute la place voulue a droite de mon JMenuBar pour ces 3 icones. Je cherché les tutorials swing, me suis plongé un peu dans les parents de JFrame (vaste famille), googelé mais sans resultat.

    Y a t il une fonction dans l'un des parents de la JinternalFrame qui definit ces 3 icones et va chercher la representation graphique que l'on voit? Je ne l'ai pas trouvé non plus.

    Aussi en desespoir, j'ai pensé recréer 3 icones et les placer a droite de mon Jmenubar en leur signifiant les attributs habituels. Mais ca semble tellement moche et je suis sur que je reinvente la roue.

  2. #2
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    les boutons à droite de la barre de titre des fenêtres sont dessinés par l'UI du composant (en général ce sera un descendant de la classe BasicInternalFrameUI). La barre de titre des JInternalFrames est créée par la méthode createNorthPane (il y a aussi des getters et setters) de cette classe.

    Bon courage pour la suite !
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Par défaut
    Voici mon code dont je derive tous mes child frame. La ligne " ui.setNorthPane(null);" detruit effectivement le NorthPane et je rapatrie la drag zone sur le Jmenubar avec le MouseMotionListener. Mais maintenant je seche pour rapatrier les 3 icones du NorthPane. Je ne parviens meme pas a detecter precisement quel est l'appel apres createNorthPane qui crees les icones. Je retrouve plein de methode pour determiner/setter l'etat de chacune des 3 icones mais ou sont celles qui les creent ?

    J'ai essayé de mettre "ui.setNorthPane(menuBar); "en lieu et place de "ui.setNorthPane(null); " et de supprimer mon MouseMotionListener, mais cela fait reapparaitre la ligne supplementaire et ne fait plus apparaitre les icones

    C'est rageant car j'ai encore vu cet apres-midi une application windows C++ MDI avec menu et icone sur la meme ligne



    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
    package client;
     
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Rectangle;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionListener;
     
    import javax.swing.BorderFactory;
    import javax.swing.JInternalFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.plaf.basic.BasicInternalFrameUI;
     
     
    public class ChildFrame extends JInternalFrame implements MouseMotionListener {
        private JMenu menuFile = new JMenu();
        private JMenuItem menuFileExit = new JMenuItem();
        private JMenuBar menuBar = new JMenuBar();
     
        public ChildFrame() {
            try {
                jbInit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // on cree la drag fonction
        public void mouseDragged(MouseEvent argEvent) {
            if (argEvent.getX() < 0 || argEvent.getY() < 0) {
                Rectangle objBounds = this.getBounds();
                this.setLocation(objBounds.x + argEvent.getX(), 
                                 objBounds.y + argEvent.getY());
            } else {
                Rectangle objBounds = this.getBounds();
                if (objBounds.x <= objBounds.x + argEvent.getX() && 
                    objBounds.x + argEvent.getX() <= 
                    objBounds.x + objBounds.width && 
                    objBounds.y <= objBounds.y + argEvent.getY() && 
                    objBounds.y + argEvent.getY() <= 
                    objBounds.y + objBounds.height) {
                    this.setLocation(objBounds.x + argEvent.getX(), 
                                     objBounds.y + argEvent.getY());
                } else {
                    this.setLocation(argEvent.getX(), argEvent.getY());
                }
            }
        }
     
        public void mouseMoved(MouseEvent argEvent) {
        }
     
        void fileExit_ActionPerformed(ActionEvent e) {
            this.dispose();
        }
     
        private void jbInit() throws Exception {
            BasicInternalFrameUI ui = (BasicInternalFrameUI)this.getUI();
            ui.setNorthPane(null);  // supprime la title bar
            this.setOpaque(true);
            this.setSize(new Dimension(908, 700));
            menuBar.add(menuFile);
            this.setJMenuBar(menuBar);
            menuFile.setText("File");
            menuFile.add(menuFileExit);
            menuFileExit.setText("Close");
            menuFileExit.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent ae) {
                            fileExit_ActionPerformed(ae);
                        }
                    });
            this.getContentPane().setLayout(null);
            menuBar.setBackground(new Color(165, 255, 165));
           // ceci assigne la drag fonction au JmenuBar
            menuBar.addMouseMotionListener(this);
            getContentPane().setLayout(null);
            this.setBorder(BorderFactory.createLineBorder(Color.black, 1));
        }
    }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Par défaut
    Quelques progrès :

    en recupérant le NorthPane dans une variable JComponent juste avant de le détruire et en ajoutant ensuite cette même variable Jcomponent au Jmenu Bar, j'ai le menu puis le tittle bar sur la meme ligne. Le problème est que je n'arrive plus a changer les couleurs ou a redefenir la taille de mon Jmenubar. celle ci s'en retrouve quelque peu aggrandie et cela doit être du a la taille des 3 icones.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     private void jbInit() throws Exception {
            BasicInternalFrameUI ui = (BasicInternalFrameUI)this.getUI();
            JComponent titlebar = ui.getNorthPane();  // on sauvegarde le NorthPane.
            ui.setNorthPane(null);  // Ceci enleve le NorthPane et donc le title bar de la JinternalFrame.
            this.setSize(new Dimension(908, 700));
            menuBar.add(menuFile);
            this.setJMenuBar(menuBar);
            menuFile.setText("File");
            menuFile.add(menuFileExit);
            menuFileExit.setText("Close");
            menuBar.add(titlebar);    // voila notre title bar et ses 3 icones, font partie de JmenuBar.
    Pourtant il me semble que "JComponent titlebar = ui.getNorthPane(); " ne crée pas un objet mais simplement une reference a l'objet NorthPane de la JInternalFrame existante et j'annule cet objet la ligne suivante. Aussi quand j'ajoute cette même reference au JmenuBar, le title bar et ses 3 icones sont bien la. Choucroute, quand tu me tiens par la barbichette .... J'avance en pataugeant. Quelqu'un pourrait m'eclairer un peu ?

  5. #5
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Disons que tu t'attaques à du dur, parce que ce n'est pas prévu pour faire ça à l'origine. L'idéal serait de redéfinir des UI pour JInternalFrame, JRootPane et peut-être JMenuBar, mais ça fait beaucoup de boulot (par contre si tu pars là-dedans tu peux faire tout ce que tu veux).

    Un autre bricolage serait de récupérer le northPane, et d'y ajouter les JMenus, mais bon, comme pour ta solution, le succès n'est pas garanti.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

Discussions similaires

  1. Critère de requête avec une zone de liste dans un formulaire
    Par Dehez dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 19/06/2006, 12h49
  2. Réponses: 1
    Dernier message: 19/01/2006, 17h54
  3. Problème avec les zones de text
    Par sorry60 dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 10/12/2005, 21h46
  4. comment revenir à la ligne avec une zone memo ?
    Par kuhnden dans le forum Access
    Réponses: 2
    Dernier message: 23/11/2005, 22h38
  5. Réponses: 3
    Dernier message: 08/09/2005, 10h45

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