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 :

récupérer un composant JPanel et le mettre dans une variable de son type


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Points : 31
    Points
    31
    Par défaut récupérer un composant JPanel et le mettre dans une variable de son type
    Salut à tout le monde,
    Je suis en train de créer une petite application avec un JTabbedpane pour faire des onglets, et pour faire ça, j’ai créé une classe héritée d’un JPanel qui s’appelle FacturePann, et à chaque fois quand je veux ajouter un onglet, je crée un objet de cette classe et je l'ajoute au JTabbedPane. Jusqu'à ici tout marche bien, mais lorsque je veux récupérer un onglet précis et le mettre dans une variable de type FacturePann, je trouve que ma variable reste null.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FacturePann fp = (FacturePann) tabbedPane.getTabComponentAt(index);
            if (fp.en == true) {
                encaisse = true;
            }
    là, je tombe dans une erreur qui dit fp est null.

  2. #2
    Membre habitué Avatar de bygui
    Homme Profil pro
    PLM/ALM
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : PLM/ALM
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 185
    Points
    185
    Par défaut
    Bonjour,
    Ta présentation semble correct. Il y a une multitude de cas possibles où ton objet tabbedPane soit null.
    Je te conseille de debugger ta classe afin de vérifier quelles objets il contient et si tu n’écrases pas sa valeur par inadvertance.

    Dans le cas où tu ne trouves pas, pourrais-tu ajouter les parties de codes qui te permettent d'initialiser/remplir ton tabbedPane
    Laisser un message après le Bug!

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    dabord merci de ta repense
    voila le code:
    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
     public void ajouterTab() {
            int index = numTabs - 1;
            if (tabbedPane.getSelectedIndex() == index) { /* if click new tab */
     
                FacturePann fp = creerJPanel(codeCli, nomCli, pNomCli);
                /* add new tab */
                tabbedPane.add(fp, "Inconnu", index);
                /* set tab is custom tab */
                tabbedPane.setTabComponentAt(index, new DemoCustomTab(this));
                tabbedPane.removeChangeListener(changeListener);
                tabbedPane.setSelectedIndex(index);
                tabbedPane.addChangeListener(changeListener);
                numTabs++;
     
            }
        }
     
    public void removeTab(int index) {
            boolean encaisse = false;
            FacturePann fp =  (FacturePann) tabbedPane.getTabComponentAt(0);
            if (fp.encaisse == true) {
                encaisse = true;
            }
            if (encaisse == true) {
                tabbedPane.remove(index);
                numTabs--;
                if (index == numTabs - 1 && index > 0) {
                    tabbedPane.setSelectedIndex(numTabs - 2);
                } else {
                    tabbedPane.setSelectedIndex(index);
                }
     
                if (numTabs == 1) {
                    ajouterTab();
                }
            }
    OU LA CLASSE FACTUREPANN ET UNE CLASSE HERIT2 DE LA CLASSE JPANEL
    ET Les METHODEs :
    ajouterTab sert a ajouter nouveau tab (englé).
    removeTab sert a le seupprimer.
    mais avant de le supprimer je dois tester un variable existe dans la classe FacturePann, mais lors de l'execution cette exception :
    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
    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: gest.commer.DemoCustomTab cannot be cast to gest.commer.FacturePann
    	at gest.commer.Facture.removeTab(Facture.java:113)
    	at gest.commer.Facture.removeTab(Facture.java:113)
    	at gest.commer.DemoCustomTab$1.mouseClicked(DemoCustomTab.java:36)
    	at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:270)
    	at java.awt.Component.processMouseEvent(Component.java:6506)
    	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    	at java.awt.Component.processEvent(Component.java:6268)
    	at java.awt.Container.processEvent(Container.java:2229)
    	at java.awt.Component.dispatchEventImpl(Component.java:4859)
    	at java.awt.Container.dispatchEventImpl(Container.java:2287)
    	at java.awt.Component.dispatchEvent(Component.java:4685)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4501)
    	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    	at java.awt.Container.dispatchEventImpl(Container.java:2273)
    	at java.awt.Window.dispatchEventImpl(Window.java:2713)
    	at java.awt.Component.dispatchEvent(Component.java:4685)
    	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:703)
    	at java.awt.EventQueue.access$000(EventQueue.java:102)
    	at java.awt.EventQueue$3.run(EventQueue.java:662)
    	at java.awt.EventQueue$3.run(EventQueue.java:660)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
    	at java.awt.EventQueue$4.run(EventQueue.java:676)
    	at java.awt.EventQueue$4.run(EventQueue.java:674)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    	at java.awt.EventQueue.dispatchEvent(EventQueue.java:673)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:216)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:135)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:123)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:119)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:111)
    	at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
    est généré.

  4. #4
    Membre habitué Avatar de bygui
    Homme Profil pro
    PLM/ALM
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : PLM/ALM
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 185
    Points
    185
    Par défaut
    D'après ton erreur, l'objet n'est pas null.
    L'erreur est que tu récupères un objet gest.commer.DemoCustomTab qui n'étend pas de la classe gest.commer.FacturePann.

    Ta méthode est donc invalide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FacturePann fp = (FacturePann) tabbedPane.getTabComponentAt(index);
    Ce qui fonctionnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DemoCustomTab dt = (DemoCustomTab) tabbedPane.getTabComponentAt(index);

    ou alors déclarer FacturePann extends DemoCustomTab
    Laisser un message après le Bug!

  5. #5
    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,

    C'est surtout que pour chaque onglet, il y a :

    • un composant de rendu de l'onglet (la partie principale qu'on veut afficher dans l'onglet)
    • une étiquette avec le nom de l'onglet (et/ou une icône)


    Le "tabComponent" c'est l'étiquette. Si tu as envie d'en faire une spéciale avec ton propre affichage, parce que par défaut le JTabbedPane affiche une icône et ou un texte (dans ton code, c'est le texte "Inconnu").

    Donc quand tu appelles getTabComponent() tu récupères le composant d'étiquette, pas le composant principale, qui lui se récupère par getComponentAt().

    Exemple 1, avec un composant de rendu de classe Component, et une étiquette personalisée par un composant de classe ComponentTab
    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
    public class JTabbedPaneExemple extends JPanel {
     
    	public static void main(String[] args) {
    		JTabbedPane pane = new JTabbedPane();
     
    		pane.add(new Component(Color.RED, "Onglet"), "Mon onglet", 0);
    		pane.setTabComponentAt(0,new ComponentTab(Color.YELLOW, "Etiquette"));
     
    		System.out.println(pane.getComponentAt(0)); // affiche class miseEnFormeDonneesCSV.JTabbedPaneExemple$Component
    		System.out.println(pane.getTabComponentAt(0)); // affiche class miseEnFormeDonneesCSV.JTabbedPaneExemple$ComponentTab
     
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.add(pane);
    		frame.setSize(300, 300);
    		frame.setVisible(true);
     
    	}
     
    	public static class Component extends JPanel {
     
    		public Component(Color bg, String text) {
    			super(new BorderLayout());
    			setBackground(bg);
    			add(new JLabel(text, JLabel.CENTER));
    		}
     
    		@Override
    		public String toString() {
    			return getClass().toString();
    		}
     
    	}
     
    	public static class ComponentTab extends Component {
     
    		public ComponentTab(Color bg, String text) {
    			super(bg,text);
    		}
     
    	}
     
    }
    Résultat :
    Nom : Capture.PNG
Affichages : 514
Taille : 2,8 Ko

    Exemple 2, avec un composant de rendu de classe Component, et une étiquette standard :
    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
    public class JTabbedPaneExemple extends JPanel {
     
    	public static void main(String[] args) {
    		JTabbedPane pane = new JTabbedPane();
     
    		pane.add(new Component(Color.RED, "Onglet"), "Mon onglet", 0);
     
    		System.out.println(pane.getComponentAt(0)); // affiche class miseEnFormeDonneesCSV.JTabbedPaneExemple$Component
    		System.out.println(pane.getTabComponentAt(0)); // affiche null (parce que pas de composant personalisé pour l'étiquette)
     
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.add(pane);
    		frame.setSize(300, 300);
    		frame.setVisible(true);
     
    	}
     
    	public static class Component extends JPanel {
     
    		public Component(Color bg, String text) {
    			super(new BorderLayout());
    			setBackground(bg);
    			add(new JLabel(text, JLabel.CENTER));
    		}
     
    		@Override
    		public String toString() {
    			return getClass().toString();
    		}
     
    	}
     
    	public static class ComponentTab extends Component {
     
    		public ComponentTab(Color bg, String text) {
    			super(bg,text);
    		}
     
    	}
     
    }
    Résulat :
    Nom : Capture.PNG
Affichages : 507
Taille : 2,9 Ko
    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.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 74
    Points : 31
    Points
    31
    Par défaut
    MERCI BEAUCOUP MR joel.drigo

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/11/2010, 13h03
  2. Réponses: 13
    Dernier message: 10/06/2008, 15h40
  3. Récupèrer champ d'une table pour mettre dans une autre table
    Par Invité(e) dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 31/03/2008, 22h59
  4. [MySQL] récupérer l'id créé et le mettre dans une autre table
    Par boubourse92 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/09/2007, 16h17
  5. Réponses: 10
    Dernier message: 10/02/2007, 18h44

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