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 :

jtabbedpane InserTab() et getTabCount()


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 21
    Par défaut jtabbedpane InserTab() et getTabCount()
    Bonjour, je compte parmi les débutants de java, et après avoir cherché, je ne trouve pas mon erreur et ne comprends pas ce qui se produit, je m'explique:

    je veux avoir une jframe contenant un jtabbedpane avec des onglets dynamiques, je crée le premier onglet avec un jpanel, et un 2° vide avec un "+" en titre.

    j'implémente un ChangeListener sur mon jtabbedpane et lui demande, si l'util a cliqué sur l'onglet "+", d'insérer une nouvelle tab juste avant ce dernier onglet.

    problème au lieu de m'insérer mon nouvel onglet, il me renomme le premier en "+" et plante.

    Le plantage vient je pense du getTabCount(), je m'en sers pour insérer le nouvel onglet juste avant l'onglet "+". Au lancement il vaut 2, ce qui est normal car j'ai le 1er onglet et le "+", mais après l'évènement j'ai toujours le même nombre d'onglets, mais il vaut maintenant 1!!! J'ai bien peur de ne pas comprendre.

    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
     
    jTabbedPane1.addChangeListener(new ChangeListener()(
     
                public void stateChanged(ChangeEvent e) {
     
                    //je place l'index juste avant le dernier onglet
                    index = jTabbedPane1.getTabCount()-1;
     
                    //si l'objet selectionne est le dernier
                    if(jTabbedPane1.getTitleAt(index).equals("+")){
     
                        //on ajoute le nouvel onglet
                        JPanel jPanel2 = new JPanel();
                        jPanel2 = jPanel1;
                        String title = "Poule "+index;
                        jTabbedPane1.insertTab(title,null,jPanel2,null,index);
     
                       //je me positionne sur l'onglet fraichement crée
                        jTabbedPane1.setSelectedIndex(index);
                     }                     
                }
    });

    merci d'avance.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Je ne comprend pas comment ton code ne part pas en boucle infinie.
    Enfin, voici un code qui fonctionne. Il est codé à l'arrache, mais tu peux t'en inspirer. L'idéal serait de passer par le model pour éviter de bidouiller les changeListener :
    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
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTabbedPane;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
     
    public class Essai implements ChangeListener
    {
    	public static void main( String[] arg ) throws Exception
    	{
    		new Essai();
    	}
     
    	private JTabbedPane pane;
     
    	public Essai() throws Exception
    	{
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    		pane = new JTabbedPane();
    		pane.add( "avant", new JPanel() );
    		pane.add( "+", new JPanel() );
    		pane.addChangeListener( this );
     
    		frame.getContentPane().add( pane );
    		frame.pack();
    		frame.setVisible( true );
    	}
     
    	@Override
    	public void stateChanged( ChangeEvent e )
    	{
    		if( pane.getSelectedIndex() == pane.getTabCount() - 1 )
    		{
    			JPanel jPanel2 = new JPanel();
    			String title = "Poule " + pane.getTabCount();
    			pane.removeChangeListener( this );
    			pane.insertTab( title, null, jPanel2, null, pane.getTabCount() - 1 );
    			pane.addChangeListener( this );
     
    			pane.setSelectedIndex( pane.getTabCount() - 2 );
    		}
    	}
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 21
    Par défaut
    Merci beaucoup pour la réponse déjà.

    C'est vrai que ça fait plus propre avec les modèles^^. Sinon j'avais pensé comme tu l'as fais enlever le listener et le remettre ensuite, mais je n'avais pas développé plus que çà.

    J'essaye çà de suite et je l'espère mettre un beau [Résolu]

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 24
    Par défaut
    Bonjour !

    Je ressors ce sujet car je reste perplexe quant à l'utilisation de JTabbedPane et du comptage des tabs...

    Imaginons que j'ai une procédure qui se charge d'afficher dynamiquement un onglet (ajout s'il n'existe pas et sélection s'il existe déjà).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int index = tabbedPane.indexOfTab(title);
    if(index==-1) { 
    	System.out.println("La view n'est pas ouverte (nb = "+tabbedPane.getTabCount()+"). Ajout de "+title);
    	tabbedPane.add(title, view.getToolBar());
    	int count = tabbedPane.getTabCount();
    	System.out.println("La view est  ouverte (nb = "+tabbedPane.getTabCount()+").");
    	tabbedPane.setTabComponentAt(count-1, view.getJTabComponent());
    	tabbedPane.setSelectedIndex(count-1);
    } else {
    	System.out.println("La vue est ouverte : selection "+index);
    	tabbedPane.setSelectedIndex(index);
    }
    Avec title simplement le titre de mon onglet.

    Voici la sortie :
    La view n'est pas ouverte (nb = 2). Ajout de Nouvelle vente
    La view est ouverte (nb = 2).
    L'onglet est bien créé, pas de soucis mais je ne comprends pas du tout pourquoi le compte n'est pas incrémenté de 1...

    Merci d'avance.

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Mon code donné en exemple fonctionne. Pourquoi veux-tu tout refaire ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 24
    Par défaut
    Pour comprendre pourquoi... !

    Et parce que la création d'un nouvel onglet n'est pas due, chez moi, à un évènement émit par le TabbedPane.

Discussions similaires

  1. [JTabbedPane] afficher texte étiquette bas en haut.
    Par spoutyoyo dans le forum Agents de placement/Fenêtres
    Réponses: 11
    Dernier message: 07/07/2009, 17h46
  2. [JTabbedPane] Modifier la couleur de l'onglet
    Par Pill_S dans le forum Composants
    Réponses: 6
    Dernier message: 17/09/2004, 12h44
  3. JTabbedPane
    Par soad dans le forum Composants
    Réponses: 3
    Dernier message: 15/07/2004, 14h57
  4. [JTabbedPane]Refresh spécifique
    Par Piolet dans le forum Composants
    Réponses: 3
    Dernier message: 11/06/2004, 19h11
  5. [JTabbedPane] Accès à des composants dynamiques
    Par SamRay1024 dans le forum Composants
    Réponses: 8
    Dernier message: 26/05/2004, 13h04

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