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

Composants Java Discussion :

Place des composants dans n'importe quel layout


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 152
    Par défaut Place des composants dans n'importe quel layout
    Bonjour à tous,

    Je suis en train de sécher sur un problème.

    J'ai écrit une méthode simple qui permet de scanner les contenu d'un JPanel à la recherche de certains composants (JTextField, JComboBox, JCheckBox, etc.).

    Ce que je souhaite est de pouvoir cliquer sur un bouton et que tous ces composants soient automatiquement remplacés par des JLabel. Quand je clique à nouveau sur le bouton, les JLabel laissent de nouveaux la place aux composants d'origine.

    Il faut évidement que tout se fasse dynamiquement, c'est à dire que ma méthode scanne le JPanel à la recherche de ces composants et qu'il relève la "position" des composants dans le layout utilisé (n'importe quel type, GridBagLayout ou autres) pour savoir où pouvoir switcher avec un JLabel.

    Ou existe-t'il une sorte de Renderer pour les JComponent qui retourne le composant à dessiner dans le layout du JPanel et qu'on pourrait faire retourner un JLabel une fois sur deux lorsqu'on clique sur le bouton ?

    Avez-vous une idée sur comment faire çà ?

    Merci d'avance pour votre aide !

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    En version bourrine mais finalement pas si conne que ça:

    Tu crées un modèle contenant des données, et tu développes deux écrans, un pour l'édition, un pour la saisie qui partagent ce modèle. que tu mets dans un cardLayout. En option tu peux utiliser un layout manager qui permet d'externaliser la config dans un fichier (genre MigLayout), config que tu mets en commun sur les deux panels, en appelant bien sur les divers champs de la même façon pour que la config soit portable...

    Ensuite il ne te restera qu'à switcher au niveau du CardLayout entre les deux écrans.

  3. #3
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Si tu veux récupérer l'emplacement d'un composant, tu as la méthode getBounds().
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 152
    Par défaut
    Merci pour vos réponses !

    @sinok : j'avais déjà pensé à ton idée mais çà devient malheureusement vite complexe lorsqu'on veut reproduire à l'identique les 2 panneaux si le panneau source contient des panneaux imbriqués et de layouts différents.

    Le getBounds() fait bien le job (je pensais que le placement dans le JPanel était absolu mais il est relatif) et permet avec l'usage d'une interface de retourner le texte du JLabel de chaque composant en fonction de son type (chaque composant implémentant cette interface).

    Puis on fait qqch du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Rectangle bounds = LE_COMPOSANT.getBounds();
    Container parentContainer = super.getParent();
    parentContainer.remove(this);
    JLabel label = new JLabel(LE_COMPOSANT.getLabelText()); // getLabelText() est une méthode Override par le componsant qui implémente l'inteface
    parentContainer.add(label);
    label.setBounds(bounds);
    ((JPanel) parentContainer).revalidate();
    parentContainer.repaint();
    J'ai encore des détails à régler avec les panneaux de layout GridBagLayout mais j'y travaille.

    Merci encore pour votre aide !

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Sinon, toujours avec le MigLayout, une autre possibilité pas trop dégueulasse est de passer par le hidemode combiné à un setVisible sur les composants. Le hidemode permet de spécifier au layout ce qu'il doit faire avec les composants non visibles en ce qui concerne l'espace qu'ils doivent remplir:

    http://migcalendar.com/miglayout/whitepaper.html (chercher hidemode)

    Et d'avoir une méthode qui bascule du mode édition au mode visualisation en settant les composants textuels à non visible (setVisible(false)) et les JLabels à visible (setVisible(true)) et inversement...

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 152
    Par défaut
    Çà ne joue malheureusement pas dans mon cas car ma méthode de scan prend en paramètre un JPanel principal (contenant les composants, mais pouvant également contenir d'autres JPanel (avec différents layouts), des ScrollPane, des TabbedPane, etc.) et je dois respecter l'agencement fourni par le JPanel principal défini par l'utilisateur et qu'il reste strictement le même.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Placer correctement des Composants dans un JPanel
    Par Lady dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 14/01/2007, 13h34
  2. (Re) ordre Z des composants dans delphi
    Par laventure dans le forum Langage
    Réponses: 2
    Dernier message: 10/10/2005, 12h30
  3. Pb pour afficher des composants dans la palette
    Par Captain_JS dans le forum C++Builder
    Réponses: 1
    Dernier message: 12/07/2005, 18h35
  4. [VS.NET] [C#] Icone des composants dans l'IDE VS 2003
    Par Ingham dans le forum Windows Forms
    Réponses: 7
    Dernier message: 11/01/2005, 23h50
  5. [Delphi] Icone des composants dans la palette
    Par jacquesberger dans le forum Composants VCL
    Réponses: 2
    Dernier message: 13/04/2004, 15h42

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