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 :

[jTabbedPane] Des onglets "invisibles" ?


Sujet :

AWT/Swing Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 10
    Points : 2
    Points
    2
    Par défaut [jTabbedPane] Des onglets "invisibles" ?
    Bonjour !

    Je travaille actuellement sur une simulation de marchés financiers, et dois la retoucher graphiquement. Dans mon interface, il y a 4 jTabbedPane, composé d'un nombre variable d'onglets (dépendant du nombre d'actions en jeu, défini sur un serveur). Ces 4 jTabbedPane sont liées : si l'on change d'onglet sur l'un, l'onglet changera pour les 3 autres !

    Ceci est donc un peu redondant et destabilise l'utilisateur ... je souhaiterais conserver le lien entre les 4 fenêtres, mais ne conserver qu'un seul groupe d'onglets (au lieu de 4).

    Ma question est donc : est-il possible de conserver le lien entre les 4 fenetres "comme si les onglets étaient visibles", mais rendre 3 groupes d'onglets "invisibles" ?

    Merci d'avance !

    Rémi

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Utilises un CardLayout (c'est un layout qui fait quelquechose de similaire à un JTabbedPane mais sans on glet et dont on change les panels de façon dynamique en prog)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse rapide ! Juste une précision, CardLayout s'utilise de la même manière que jTabbedPane ? C'est-à-dire que grosso modo je devrai juste remplacer les jTabbedPane1 jTabbedPane2 jTabbedPane3 et jTabbedPane4 par des CardLayout1 CardLayout2 ... ?

    Merci encore !

    Rémi

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Okay ! Je viens de passer un peu de temps sur le code, mais quelquechose me dérange :

    actuellement, le lien entre les différents jTabbedPane est codé ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     private void selectTabsNum(int index) {
        if ((jTabbedPane1.getSelectedIndex() != index) &&
            (jTabbedPane1.getTabCount() > index)) {
          jTabbedPane1.setSelectedIndex(index);
        }
        if ((jTabbedPane2.getSelectedIndex() != index) &&
            (jTabbedPane2.getTabCount() > index)) {
         jTabbedPane2.setSelectedIndex(index);
       }
       if ((jTabbedPane3.getSelectedIndex() != index) &&
           (jTabbedPane3.getTabCount() > index)) {
         jTabbedPane3.setSelectedIndex(index);
       }
     }
    Si je remplace les 3 TabbedPane par 3 Cards, il m'est impossible de getSelectedIndex, de getTabCount, ou même de addChangeListener (qui est utile dans la suite du programme ...). Existe t il des équivalents pour les Cards ?
    D'autre part, il me faudra conserver un groupe d'onglets ! Est-il possible de faire correspondre un onglet aux autres Cards ?

    Voyez-vous une solution à ce problème ou pensez-vous que les Cards sont mal adaptées à mon souci ?

    Merci d'avance !

    PS : je vous joins un screenshot de mon interface afin que vous puissiez mieux appréhender le problème.
    Images attachées Images attachées  

  6. #6
    Membre éprouvé
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Points : 936
    Points
    936
    Par défaut
    Attention la CardLayout est un layout et non un composant graphique. Ca ne s'utilise pas pareil.

    Je pense qu'avec ta capture d'écran tu devrais reposer clairement ta problèmatique, c'est un peu flou sur le résultat que tu attends.

    Edit:
    Ok je viens comprendre.

    Il faut que tu nommes tes cards, et quand tu affiches un tab dans ton tabbedpane, tu demandes aux trois cardlayout d'afficher les cards dont tu passes le nom.
    Quels sont tes besoins avec les actionlistener ?

    n!co

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Je vais essayer de clarifier mon objectif :

    Sur le screenshot, tu peux voir qu'il y a quatre groupes d'onglets identiques (quatre jTabbedPane) New York - Elf, New York - Total, Paris - Total. Chaque onglet correspond à une action boursière différente. Lorsque l'on change d'onglet sur l'un des jTabbedPane, les 3 autres changent également.

    C'est la solution qui avait été retenue pour relier les 4 panneaux (à chaque action correspond un graphe "Market Properties", un "Order Book" ... cf screenshot).

    Mon travail est donc d'alléger l'interface, en ne mettant plus qu'un groupe d'onglets en haut, qui commanderait les 4 fenêtres. Est-ce plus clair ?

    Je me demande si, tout simplement, il n'y a pas possibilité de masquer les petits onglets (là ou sont notés New York - Elf, New York - Total, Paris - Total) sauf pour un seul jTabbedPane. Mais a priori, ce ne sera pas aussi simple !

    Merci pour ton aide, j'espère avoir été clair !

    Rémi

  8. #8
    Membre éprouvé
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Points : 936
    Points
    936
    Par défaut
    Ok je viens comprendre.

    Il faut que tu nommes tes cards, et quand tu affiches un tab dans ton tabbedpane, tu demandes aux trois cardlayout d'afficher les cards dont tu passes le nom.
    Quels sont tes besoins avec les listeners vu que tu n'as plus d'action sur tes cards ?

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Il faut que tu nommes tes cards, et quand tu affiches un tab dans ton tabbedpane, tu demandes aux trois cardlayout d'afficher les cards dont tu passes le nom.
    Tu veux dire que je dois garder un tabbedpane et remplacer les 3 autres par des cardlayout ?

    Mon problème est que le nombre d'onglet n'est pas fixé ! Je t'explique briévement le principe : mon programme est composé d'un "server" et d'un "client". Sur un ordinateur 1, on informe le server du nombre d'actions que l'on veut, leur prix etc.. le serveur enregistre tout cela dans un .xml. Puis, sur une machine 2, on se connecte avec le client sur l'ip de la machine 1 qui a lancé le server. C'est la que le client reçoit toute sorte d'infos, dont le nombre d'actions (et le nombre d'onglets par conséquent).

    Vois tu le principe ?

    [Edit] Voila le code pour ta question sur le listener :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    jTabbedPane1.addChangeListener(new  GClientFrame_jTabbedPane1_changeAdapter(this));
    class GClientFrame_jTabbedPane1_changeAdapter implements javax.swing.event.ChangeListener {
      GClientFrame adaptee;
     
      GClientFrame_jTabbedPane1_changeAdapter(GClientFrame adaptee) {
        this.adaptee = adaptee;
      }
      public void stateChanged(ChangeEvent e) {
        adaptee.jTabbedPane1_stateChanged(e);
      }
     
    }
    La Gclientframe est la frame principal, le jTabbedPane1 l'un des tabbedpane du client.

  10. #10
    Membre éprouvé
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Points : 936
    Points
    936
    Par défaut
    Le cardlayout n'étant pas un composant graphique il ne peut pas y avoir d'interaction utilisateur dessus.

    Plusieurs solution s'ouvre alors à toi :
    - Garder un tabbedpane et remplacer les trois autres par des cardlayout. Ton tabbedpane centralise les actions utilisateur et fait les requetes sur le cardlayout pour afficher les cards correspondantes. (tu ajoutes tes panels dynamiquement au cardlayout comme tu le fais avec le tabbedpane)
    - Tu peux aussi remplacer tous tes tabbedpane par des cardlayout, mais il te faut garder qqs pour interagir avec l'utilisateur : une rangé de bouton, une liste, ....
    - T'as pensé aussi a créer un seul gros tabbedpane qui pour chaque onglet contiendrait les 4 fenetres ?

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Je vais suivre la 1ere ou la 3eme solution, en voyant ce qui me prendra le moins de tps !

    La conversion TabbedPane --> CardLayout est-elle aisée ? Y'a t'il certaines règles à garder à l'esprit ?

    Merci pour ton aide précieuse !

    Rémi

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Rebonsoir !

    Je suis toujours sur mon problème de conversion jTabbedPane --> CardLayout.

    J'ai donc créé mon CardLayout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      JPanel jCards1 = new JPanel(new CardLayout());
    Ce jCards1 remplace le jTabbedPane1 qui existe actuellement. Je lui ajoute ensuite dynamiquement des panels :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      jCards1.add(op.getInstitution(),
     ClientCore.getInstitution(op.getInstitution()).getClientPanel(op));
    (c'est du type .add(char, component))

    C'est à ce moment que je rencontre une difficulté : actuellement, pour lier les 4 jTabbedPane existants, on a créé une méthode qui active pour les 4 jTabbedPane le mm index :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     private void selectTabsNum(int index) {
        if ((jTabbedPane1.getSelectedIndex() != index) &&
            (jTabbedPane1.getTabCount() > index)) {
          jTabbedPane1.setSelectedIndex(index);
        }
     
    if ((jTabbedPane2.getSelectedIndex() != index) &&
            (jTabbedPane2.getTabCount() > index)) {
          jTabbedPane2.setSelectedIndex(index);
        }
     
    //... etc pour les 4 jTabbedPane
    Ainsi, dès que l'utilisateur change d'onglet sur l'un des jTabbedPane :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void jTabbedPane1_stateChanged(ChangeEvent e) {
    selectTabsNum(jTabbedPane1.getSelectedIndex());
      }
     
    //...etc pour les 4 jTabbedPane
    Il faudrait que dans la méthode selectTabsNum, je puisse sélectionner la Card de mon CardLayout correspondant .... Je patauge depuis plusieurs jours sur ce problème ... Si quelqu'un pouvait éclairer ma lanterne par une inspiration de génie, je lui serais plus que reconnaissant ! Peut être peut on récupérer le numéro de la Card ? Dans ce cas, la méthode serait la même !

    Merci d'avance,

    Rémi

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Le CardLayout ne s'emploie pas de cette façon, il faut conserver l'instance afin de pouvoir faire des show("monPane")

    Donc grosso merdo tu te fais un petit model contenant les assoc numéro de tab, nom de panel, ainsi que le tab sélectionné, et qui déclenche des Events quand le tab sélectionné est changé.

    Cf ce cours pour savoir comment implémenter des listeners si besoin est: http://rom.developpez.com/java-listeners/


    Puis tu crées ton TabPane, tes trois CardLayout (et donc les panels) qui vont être des listeners de ton model et tu fais en sorte qu'ils choisissent le panel qui va bien lors du déclenchement de l'évènement.

    Donc rien de bien violent...


    Enfin en y repensant, pourquoi pas un seul JTabbedPane qui contiendrait tous les panels relatifs à une agence agencé de la bonne manière....

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup pour ta réponse !

    2 3 ptits trucs que je ne pige pas (pardonnez mon ignorance) :
    - "conserver l'instance" ?
    - Qu'entends tu par "model" ?

    En gros dans la partie "ChangeEvent" du code de mon précédent message, je dois réussi à lui demander de sélectionner la bonne card, si j'ai bien compris ?
    Mais comment la désigner ?

    Merci encore !

    Rémi

  15. #15
    Membre éprouvé
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Points : 936
    Points
    936
    Par défaut
    Citation Envoyé par rquilliet
    Mais comment la désigner ?
    add(String, component) est deprecated (enfin non conseillé).
    Utilises plutot add(Component, Object) et ensuite tu pourras afficher le card que tu veux avec la méthode CardLayout#show(Container parent, String name)

    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
     
    public class NewJPanel extends javax.swing.JPanel {
     
        public NewJPanel() {
            CardLayout layout = new CardLayout();
            setLayout(layout);
     
            JPanel panel1 = new JPanel();
            add(panel1, "card1");
     
            JPanel panel2 = new JPanel();
            add(panel2, "card2");
     
            layout.show(this, "card1");
            layout.show(this, "card2");
        }
    }

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/08/2005, 20h30
  2. Rendre invisibles des onglets de formulaires
    Par cabort josé dans le forum IHM
    Réponses: 4
    Dernier message: 16/11/2004, 18h48

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