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

Collection et Stream Java Discussion :

Tableau et classes abstraites


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut Tableau et classes abstraites
    Bonjour à tous,

    Je n'arrive pas à trouver la solution à ce problème, je n'arrive pas à la trouver dans ma doc.

    J'ai une fenêtre avec un JMenu. A côté, une classe ValTransfo conserve des valeurs int et double. Je l'utilise sous forme de tableau :
    ValTransfo[] TDP = new ValTransfo[];

    Depuis les menus de la fenêtre, j'appelle TDP[i]. setVal(int...), mais comme Action event est une classe abstraite, cela ne marche pas. Que dois-je faire? (en fait, j'essaie de transférer des valeurs d'une fenêtre de JSpinners vers cette ValTransfo).

    Dois-je créer une classe spéciale? Je n'arrive pas à trouver laquelle. Et puis, encore une nouvelle classe?

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Citation Envoyé par HNoury
    Depuis les menus de la fenêtre, j'appelle TDP[i]. setVal(int...), mais comme Action event est une classe abstraite, cela ne marche pas.
    Je ne comprends pas cette phrase...

    Et je ne vois pas où est ton problème de menu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    JMenuItem leBoutonDeTonMenu = new JMenuItem("bouton du menu");
    leBoutonDeTonMenu.addActionListener(
       new ActionListener() {
          public void ActionPerformed(ActionEvent e) {
             TDP[i]. setVal(int...);
          }
       }
    );
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    Oui, en effet, il faut instancier le TDP[] dans la méthode Action Event, et non dans le constructeur de la fenêtre. Là, il est reconnu. J'espère, et je vais tester cela aujourd'hui, qu'il ne sera pas initialisé à chaque nouvelle manip des menus!

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    J'ai vraiment un conflit entre mon tableau et les classes abstraites. Si je mets l'ActionEvent dans le constructeur de ma fenêtre, le compilateur le rejette parce que je ne peux pas mettre de méthode abstraite dans un constructeur. Si je fais une void à part, le tableau se perd en cours de route, et, à l'éxécution, une NullPointerExeption apparaît.

    Que peut-on faire???

    J'ai essayé de mettre final TDP[], ou static, cela n'a rien changé par exemple.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 84
    Par défaut
    Bonjour,

    Est-ce que tu pourrais mettre ton code afin de voir ce qui cloche ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    Voila la classe qui pose problème. J'ai mis beaucoup de code, j'espère qu'on peut...
    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    class Fenetre extends JFrame implements ActionListener { //implements ActionListener
    	Fenetre(){
    		setTitle ("IFS ");
    		setSize (800, 550); 
     
    		pan = new JPanel();
    		pan.setSize(800,550);
    		//(...)
    		JMenuBar barreMenus = new JMenuBar(); 		// barre de menus.
    		setJMenuBar (barreMenus);
    		//(...)		
    		JMenu Transfo = new JMenu ("Transformation"); 	// Menu Transformation.
    		barreMenus.add(Transfo);
    		SauverTransfo = new JMenuItem ("Sauver les modifications"); 
    		SauverTransfo.addActionListener (this);
    		Transfo.add(SauverTransfo);
    		TransfoMoins = new JMenuItem ("Transformation précédente"); 
    		TransfoMoins.addActionListener (this);
    		Transfo.add(TransfoMoins);
    		TransfoPlus = new JMenuItem ("Transformation suivante"); 
    		TransfoPlus.addActionListener (this);
    		Transfo.add(TransfoPlus);
     
     
    		C1 = new PlanC();		/*C1 est une fenêtre de JSpinners avec écouteurs.*/
    		C1.setVisible(true);		/*C1 est doté de méthodes set et get.*/
    	}
     
    	public void actionPerformed (ActionEvent e){	
    		Object source = e.getSource();
    		ValPlan VP = new ValPlan(); 
    	/* Si je n'instancie pas ici VP et TDP[], rien ne marche, mais alors je ne peux bien évidemment pas stocker les valeurs puisque elles sont réinitialisées !*/
     
    		nT = 4;
     
    		ValTransfo TDP[] = new ValTransfo[nT];	//Tableau de transformations.	
     
    		VP.setRedValP(0);	
    /*enregistrement des valeurs par défaut. Le tableau n'est pas conservé si je fais ceci dans la méthode « Nouveau », ce qu'il faudra bien faire pourtant...*/
    		VP.setGreenValP(0);				
    		//(etc, pour les autres valeurs...)
     
    			for (i=0; i<nT; i++){	
     
    			TDP[i] = new ValTransfo();		
    			TDP[i].setRotVal(0);			/* Même remarque...*/
    			//(etc, pour les autres valeurs...)
    			}
     
     
     
    		if (source == Nouveau)		{
     
    	/* Si j'enregistre ici les valeurs par défaut, le tableau est perdu ensuite!*/
     
    			VP.setRedValP(0);				
    			VP.setGreenValP(0);				
    			//(.etc, pour les autres valeurs..)
     
    			for (i=0; i<nT; i++){	
     
    			TDP[i] = new ValTransfo();		
    			TDP[i].setRotVal(0);			
    			//(etc, pour les autres valeurs ...)
    			}
    		}
     
    	if (source == SauverTransfo)		{
    /*ceci marche depuis que j'ai précisé que C1 était « final PlanC C1 », et non « PlanC C1 » tout seul*/
     
    			int i = C1.getiT();
     
    			RotVal = C1.getRotation();
    			HomXVal = C1.getHomotetieX();
    				//(.etc, pour les autres valeurs..)
     
    		/*Ceci ne marche pas*/	
    			TDP[i].setRotVal(RotVal);			
    			TDP[i].setSymXVal(SymXVal);
    			//(etc, pour les autres valeurs ...)
     
    		}
     
    		if (source == TransfoPlus)		{
    		/*On veut ici rappeler à la fenêtre de Jspinners les valeurs du tableau*/	
    			int i = C1.getiT();
     
    			if (i<(nT-1)){
    				i++;
    				C1.setiT(i);
     
    				C1.setRotation(TDP[i].getRotVal());			
    				C1.setSymetrieX(TDP[i].getSymXVal());
    				//(etc, pour les autres valeurs ...)
    			}
    			else{
    			}
    		}
     
    		if (source == TransfoMoins)		{
     
    			/*(similaire à la précédente)*/
    	}
    	}
     
    	private JPanel pan;
    	private JMenu Fichiers, Film, Plan, Transfo;
    	private JMenuItem Nouveau, Ouvrir, Enregistrer, ExportFilm, CalculFilm, MontrerCont;
    	private JMenuItem ExportPlan, AllerPlan, TracePlan, SauvePlan;
    	private JMenuItem SauverTransfo, TransfoPlus, TransfoMoins;
    	final public PlanC C1;
     
    	public Color CouleurT, CFd;
    	public double A, B, C, D, E, F, ProbVal;
    	public double HomXVal, HomYVal, TransXVal, TransYVal;
    	public int RotVal, SymXVal, SymYVal, RedVal, GreenVal, BlueVal;
    	public int RedValP, GreenValP, BlueValP, CadreXVal, CadreYVal, NbrePts;
    	public int nT, i, iT, nP;
    	public int ZoomVal;
    	double AnRad;
     
    	private ValTransfo TDP[];//cela ne marche pas mieux avec public...
    	private ValPlan VP;//idem.
    }
    Notez que si j'instancie VP ou TDP[] dans le constructeur de la fenêtre, et non dans les void, cela ne marche pas non plus. Comment résoudre le problème?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 84
    Par défaut
    Est ce que tu peux essayer de créer une méthode clone() dans ton objet ValTransfo.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    protected ValTransfo clone() {
    	ValTransfo vt = new ValTransfo();
    	vt.setRotVal(RotVal);
    	vt.setSymXVal(SymXVal);
    	return vt;
    }
    Et au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TDP[i].setRotVal(RotVal);
    TDP[i].setSymXVal(SymXVal);
    Tu mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ValTransfo vt = new ValTransfo();
    vt.setRotVal(RotVal);
    vt.setSymXVal(SymXVal);
    TDP[i] = vt.clone();

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    Merci beaucoup Mike pour ta réponse. Je vais essayer cela.

    Si je t'ai bien compris, le clone est à créer dans la méthode ActionEvent? En entête?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 84
    Par défaut
    Il faut créer le clone dans la classe ValTransfo... Je pense que le problème vient du fait que tous les éléments du tableau pointe vers un même Objet.

    En clair, quand tu modifie un élément du tableau, cela modifie tous les éléments.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    Merci beaucoup pour ta réponse rapide Mike. Je pense que c'est au niveau de la conception de ces tableaux de valeurs que le problème se pose en effet. On peut facilement instancier une ValTransfo, faire (durant la méthode ActionEvent):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ValTransfo vt = new ValTransfo();
    vt.setRotVal(RotVal);
    vt.setSymXVal(SymXVal);
    cela marche très bien, mais TDP[i] = vt.clone() est dit "incompatible" par le compilateur.(que ce soit au sein de l'ActionEvent, ou en dehors d'ailleurs!)

    Je vais réfléchir un peu à tes explications et utiliser ta méthode clone.

    A+, et merci encore!

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 84
    Par défaut
    En fait il faut que tu surcharges la méthode clone() dans ton objet ValTransfo. Par défaut, la fonction est définie de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    public class ValTransfo {
    ...
    	protected Object clone()
    			throws CloneNotSupportedException {
    		return super.clone();
    	}
    ...
    }
    Il faut que tu mettes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ...
    public class ValTransfo {
    ...
    	protected ValTransfo clone()
    			throws CloneNotSupportedException {
    		ValTransfo vt = new ValTransfo();
    		vt.setRotVal(RotVal);
    		vt.setSymXVal(SymXVal);
    		return vt;
    	}
    ...
    }
    Et normalement ca devrait passer

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    Merci beaucoup, Mike, tu es vraiment très sympa. J'essaie cela, ce soir ou demain.

    Bien à toi,

    HNoury

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    Désolé Mike, cela n'a pas marché. Merci beaucoup néanmoins pour ton aide. Je vais reprendre le problème différement.

    Dans mon bouquin, "Programmer en Java", on y montre comment on peut créer une classe indépendante avec la méthode de l'interface et un constructeur, qui, visiblement, permet de récupérer et modifier des variables. Je vais relire et imiter cela. Peut-être dois-je aussi abandonner ma classe ValTransfo et faire int[]ValRot = new int[], etc.(idem pour toutes les variables...)

    Merci encore, je vais chercher de mon côté. (sauf si vous avez une idée bien sûr!)

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    Ca y est, le problème est résolu. Il fallait créer une classe de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class SauveTransfo extends AbstractAction{
     
    	public SauveTransfo (PlanC C1, ValTransfo[] TDP)
    		{this.C1 = C1;
    		this.TDP = TDP;
    		}
     
    		public void actionPerformed (ActionEvent e)
    		{int i = C1.getiT();
     
    			RotVal = C1.getRotation();
    			HomXVal = C1.getHomotetieX();//etc.
    Bizarement aussi, il fallait initialiser les ValTransfo avant la création des JMenu dans la fenêtre principale pour que cela marche. Pourtant, cette fonction du menu n'est pas utilisée avant que la fenêtre ne soit crée!

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

Discussions similaires

  1. tableau héritage classe abstraite
    Par zeracoa dans le forum C++
    Réponses: 18
    Dernier message: 07/04/2013, 23h55
  2. Tableau d'objets de classe abstraites?
    Par dré kam dans le forum Débuter
    Réponses: 14
    Dernier message: 19/02/2012, 18h39
  3. Tableau et classe abstraite
    Par NFHnv dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 18/03/2009, 15h28
  4. Classe abstraite / MVC
    Par caramel dans le forum MVC
    Réponses: 5
    Dernier message: 01/04/2003, 09h27
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

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