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

Agents de placement/Fenêtres Java Discussion :

JFrame JPanel et scope de variable


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Par défaut JFrame JPanel et scope de variable
    Bonjour,

    Je me remet un peu a Swing et non sans mal

    J'ai une question existentiel.
    J'ai une JFrame contenant plusieurs JPanel.

    Pour rendre le code plus lisible j'ai fait une classe pour chaque panel.

    Mon problème vient du fait que je ne sais pas comment modifier via le JFrame une variable se trouvant dans une des classes JPanel.

    Problème qui ne se pose pas si tout les JPanel sont des méthodes de la classe JFrame avec des variables globales.

    J'ai essayé en faisant un setter dans la classe JPanel mais il ne me la reconnait pas dans mon JFrame.

    Merci d'avance pour vos réponses éclairés

  2. #2
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Salut,

    il ne reconnait pas quoi ? la methode ?
    Comme ca je dirais de declaré en attribut de classe chacun de tes JPanel et normalement avec le setter qui va bien ca devrait y aller.

    Ce serait pas un pb de ton IDE ?

    Sinon fais voir le code pour voir ce qui va pas

  3. #3
    Membre émérite
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Par défaut
    Alors voila le code en question.

    Voici ma classe AccordPanel :
    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
    public class AccordPanel extends JPanel {
    	private static List images;
     
    	private List gamme = new ArrayList();
     
    	private static int startWidth = 2;
    	private static int width=14;
    	private static int height=10;
     
    	public void coucou() {
     
    	}
     
    	public AccordPanel() {
          images = new ArrayList();
          images.add(getToolkit().getImage("line0.gif"));
          images.add(getToolkit().getImage("line0bordbas.gif"));
          images.add(getToolkit().getImage("line0bordhaut.gif"));
          images.add(getToolkit().getImage("line1.gif"));
          images.add(getToolkit().getImage("line2.gif"));
          images.add(getToolkit().getImage("line3.gif"));
          images.add(getToolkit().getImage("notenoire.gif"));
          images.add(getToolkit().getImage("notenoirebas.gif"));
          images.add(getToolkit().getImage("notenoirehaut.gif"));
          images.add(getToolkit().getImage("noterouge.gif"));
          images.add(getToolkit().getImage("noterougebas.gif"));
          images.add(getToolkit().getImage("noterougehaut.gif"));
          setPreferredSize(new Dimension(300, 200));
        }
     
    	public void testMethod(){
    		System.out.println("testMethod()");
    	}
     
    	public void paintComponent(Graphics g) {
    		super.paintComponent(g);
     
    		//List gamme = new ArrayList();
    		gamme.add(new Note(false, 1, 1));
    		gamme.add(new Note(false, 1, 3));
    		gamme.add(new Note(true, 2, 1));
    		gamme.add(new Note(false, 2, 4));
    		gamme.add(new Note(false, 3, 3));
    		gamme.add(new Note(false, 4, 1));
    		gamme.add(new Note(false, 4, 3));
    		gamme.add(new Note(false, 4, 5));
    		gamme.add(new Note(false, 5, 1));
    		gamme.add(new Note(true, 5, 3));
    		gamme.add(new Note(false, 6, 1));
    		gamme.add(new Note(false, 6, 3));
     
    		createSchema(g, gamme);
    	}
     
    	private void createSchema(Graphics g, List listeNotes) {
    		drawEmptyGrid(g);
     
    		if (listeNotes != null ) {
    			for (Iterator iter = listeNotes.iterator(); iter.hasNext();) {
    				Note element = (Note) iter.next();
    				if (element.isTonique()) {
    					drawTonalNote(g, element.getCorde(), element.getCase());
    				} else {
    					drawOtherNote(g, element.getCorde(), element.getCase());
    				}
    			}
    		}
    	}
     
    	private void drawEmptyGrid(Graphics g) {
    		drawEmptyUpLine(g, 1);
    		drawEmptyLine(g, 2);
    		drawEmptyLine(g, 3);
    		drawEmptyLine(g, 4);
    		drawEmptyLine(g, 5);
    		drawEmptyDownLine(g, 6);
    	}
     
     
                 .....
    }
    Et ma classe FenetrePrincipale :
    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
    125
    126
    127
    128
    129
    130
    public class FenetrePrincipale extends JFrame implements ActionListener {
     
    	public static int x[] = { 0, 0, 1 };
    	public static int y[] = { 0, 1, 0 };
    	public static int larg[] = { 1, 1, 3 };
    	public static int haut[] = { 1, 2, 3 };
    	public static int px[] = { 20, 20, 60 };
    	public static int py[] = { 20, 40, 60 };
    	public static JPanel pan1;
    	public static JPanel pan2;
    	public static JPanel pan3;
    	private JPanel containerHaut = null;
    	private FlowLayout layout = null;
    	private JButton bouton = null;
     
    	private JLabel texteGamme = null;
    	private JLabel texteAccord = null;
     
    	private JComboBox listNotes = null;
    	private JComboBox listCouleurs = null;
    	private JComboBox listTons = null;
    	private JComboBox listModes = null;
     
    	private Object[] notes = new Object[] { "Do", "Do#", "Ré", "Ré#", "Mi", "Fa", "Fa#", "Sol", "Sol#", "La", "Si", "Si#"  };
    	private Object[] couleurs = new Object[] { "- - 3 SONS - -","Majeur","Mineur","sus4","b5","Augmenté","Diminué","- - 4 SONS - -","7","7(#5)","7(sus4)","Maj7","Maj7(#5)","Maj7(b5)","Min7","Min(Maj7)","Min7(b5)","6","Min6","Dim7","Add9","Min(Add9)","- - 5 SONS - -","9","7(b9)","7(#9)","Maj7(9)","Min7(9)","6(9)","Min6(9)" };
     
    	private Object[] tons = new Object[] { "Do", "Do#", "Ré", "Ré#", "Mi", "Fa", "Fa#", "Sol", "Sol#", "La", "Si", "Si#"  };
    	private Object[] modes = new Object[] { "Pentatonique mineure","Pentatonique majeure","- - MAJEURE - -","Ionien (gamme majeure)","Dorien","Phrygien","Lydien","Mixolydien","Eolien (gamme mineure)","Locrien","- -MINEURE HARMONIQUE- -","Mineure harmonique","Locrien #13","Ionien #5","Dorien #11","Phrygien #3","Lydien #9","Superlocrien bb7","- - MINEURE MELODIQUE - -","Mineur mélodique","Dorien b9","Lydien augmenté","Lydien dominante","Mixolydien b13","Locrien #9","Altéré superlocrien","- - SYMETRIQUE - -","Arpèges diminuée","Augmentée","Chromatique","Diminuée ton/demi-ton","Diminuée demi-ton/ton","Par ton","- - EXOTIQUE - -","Arabe","Balinaise","Dominante pentatonique","Double harmonique","Enigmatique","Espagnole","Gypsy","Japonaise","Kokin Joshi","Orientale","Persan","Promethée" };
     
     
    	private int nombre = 0; // Déclaration du chiffre
     
    	public FenetrePrincipale() {
    		super();
    		build();
    	}
     
    	private void build() {
     
    		setTitle("Apprendre les gammes de la guitare");
    		setSize(800, 500);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		Container contenu = getContentPane();
    		GridBagLayout g = new GridBagLayout();
    		contenu.setLayout(g);
    		GridBagConstraints c = new GridBagConstraints();
    		c.fill = c.BOTH;
     
    		pan1 = getContainerSelection();
    		pan1.setBorder(new TitledBorder(" Selectionner "));
     
    		pan2 = new AccordPanel();
    		pan2.setBackground(Color.white);
                              // ici je ne peux pas appeler de méthode particuliere de pan2, je veux modifier la liste gammes 
     
    		for (int i = 0; i < x.length; i++) {
    			c.gridx = x[i];
    			c.gridy = y[i];
    			c.gridwidth = larg[i];
    			c.gridheight = haut[i];
    			c.weightx = px[i];
    			c.weighty = py[i];
    			switch (i) {
    			case 0:
    				contenu.add(pan1, c);
    				break;
    			case 1:
    				contenu.add(pan2, c);
    				break;
    			/*case 2:
    				contenu.add(pan3, c);
    				break;*/
    			}
    		}
     
    	}
     
    	private JPanel getContainerSelection() {
    		layout = new FlowLayout();
    		layout.setAlignment(FlowLayout.LEFT);
     
    		containerHaut = new JPanel();
    		containerHaut.setLayout(layout);
     
    		texteGamme = new JLabel();
    		texteGamme.setPreferredSize(new Dimension(70, 25));
    		texteGamme.setText("Gamme :");
     
    		listNotes = new JComboBox(notes);
    		listNotes.setPreferredSize(new Dimension(50, 25));
     
    		listCouleurs = new JComboBox(couleurs);
    		listCouleurs.setPreferredSize(new Dimension(100, 25));
     
    		texteAccord = new JLabel();
    		texteAccord.setPreferredSize(new Dimension(70, 25));
    		texteAccord.setText("Accord :");
     
    		listTons = new JComboBox(tons);
    		listTons.setPreferredSize(new Dimension(50, 25));
     
    		listModes = new JComboBox(modes);
    		listModes.setPreferredSize(new Dimension(150, 25));
     
    		bouton = new JButton();
    		bouton.setPreferredSize(new Dimension(70, 25));
    		bouton.setText("Valider");
    		bouton.addActionListener(this);
     
    		containerHaut.add(texteGamme);
    		containerHaut.add(listNotes); 
    		containerHaut.add(listCouleurs);
    		containerHaut.add(texteAccord);
    		containerHaut.add(listTons); 
    		containerHaut.add(listModes);
     
    		containerHaut.add(bouton);
     
    		return containerHaut;
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		// Si l'action émane bien du bouton
    		if (e.getSource() == bouton) {
    			nombre++;
    			//texte.setText("Vous avez cliqué " + nombre + " fois sur le bouton");
    		}
    	}
     
    }
    En gros quand j'ajoute une methode a la classe AccordPanel, elle n'est pas retrouvée dans la JFrame FenetrePrincipale

  4. #4
    Membre émérite
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Par défaut
    Je suis stupide ^^

    J'essayais veinement d'accéder à une méthode setGamme de la classe AccordPanel sans caster pan2 en AccordPanel.

  5. #5
    Membre émérite
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Par défaut
    Aller ! je remonte le sujet car j'ai maintenant un autre problème.

    J'arrive effectivement à modifier des données d'un JPanel a partir de ma JFrame. Maintenant je voudrais faire le contraire.

    Je veux externaliser la méthode getContainerSelection() dans une Classe qui étend JPanel mais je ne sais pas comment gérer les actions des boutons.

    Exemple :

    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
    public class FenetrePrincipale extends JFrame implements ActionListener {
    
    	public static int x[] = { 0, 0, 1 };
    	public static int y[] = { 0, 1, 0 };
    	public static int larg[] = { 1, 1, 3 };
    	public static int haut[] = { 1, 2, 3 };
    	public static int px[] = { 20, 20, 60 };
    	public static int py[] = { 20, 40, 60 };
    	public static JPanel pan1;
    	public static JPanel pan2;
    	public static JPanel pan3;
    	private JPanel containerHaut = null;
    	
    
    	public FenetrePrincipale() {
    		super();
    		build();
    	}
    
    	private void build() {
    		setTitle(PropertiesHelper.getMessageBundle("frame.label.titre"));
    		setSize(800, 500);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		Container contenu = getContentPane();
    		GridBagLayout g = new GridBagLayout();
    		contenu.setLayout(g);
    		GridBagConstraints c = new GridBagConstraints();
    		c.fill = c.BOTH;
    		
    		pan1 = new SelectionPanel();
    		pan1.setBorder(new TitledBorder(PropertiesHelper.getMessageBundle("panel1.label.titre")));
    		
    		pan2 = new AccordPanel();
    		pan2.setBackground(Color.white);
    		pan2.setBorder(new TitledBorder(PropertiesHelper.getMessageBundle("panel2.label.representation")));
    
    		for (int i = 0; i < x.length; i++) {
    			c.gridx = x[i];
    			c.gridy = y[i];
    			c.gridwidth = larg[i];
    			c.gridheight = haut[i];
    			c.weightx = px[i];
    			c.weighty = py[i];
    			switch (i) {
    			case 0:
    				contenu.add(pan1, c);
    				break;
    			case 1:
    				contenu.add(pan2, c);
    				break;
    			}
    		}
    	}
    
    	public void actionPerformed(ActionEvent e) {
    		// Si l'action émane bien du bouton
    		// Ici je n'ai pas acces aux boutons du pan1		
    	}
    }
    Mon pan1 :
    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
    public class SelectionPanel extends JPanel {
    	
    	private FlowLayout layout = null;
    	
    	private JLabel texteGamme = null;
    	private JLabel texteAccord = null;
    	
    	private JComboBox comboNotes = null;
    	private JComboBox comboCouleurs = null;
    	private JComboBox comboTons = null;
    	private JComboBox comboModes = null;
    	private JButton boutonAccord = null;
    	private JButton boutonGamme = null;
    		
    	private Object[] notes = new Object[] { "Do", "Do#", "Ré", "Ré#", "Mi", "Fa", "Fa#", "Sol", "Sol#", "La", "Si", "Si#"  };
    	private Object[] couleurs = new Object[] {"Majeur","Mineur","sus4","b5","Augmenté","Diminué"};	
    	private Object[] tons = new Object[] { "Do", "Do#", "Ré", "Ré#", "Mi", "Fa", "Fa#", "Sol", "Sol#", "La", "Si", "Si#"  };
    	
    	private Object[] modes = new Object[] { "Pentatonique mineure","Pentatonique majeure","- - MAJEURE - -","Ionien (gamme majeure)","Dorien","Phrygien","Lydien" };
    	
    	public SelectionPanel(FenetrePrincipale parent) {
    		layout = new FlowLayout();
    		layout.setAlignment(FlowLayout.LEFT);
    
    		this.setLayout(layout);
    
    		texteGamme = new JLabel();
    		texteGamme.setPreferredSize(new Dimension(70, 25));
    		texteGamme.setText("Gamme :");
    		
    		comboNotes = new JComboBox(notes);
    		comboNotes.setPreferredSize(new Dimension(50, 25));
    		//comboNotes.setRenderer(new ComboBoxRenderer());
    -->comboNotes.addActionListener(); // faut il que je mette this et que j'implémente ActionListener ????
    
    		comboCouleurs = new JComboBox(couleurs);
    		comboCouleurs.setPreferredSize(new Dimension(100, 25));
    		//comboCouleurs.setRenderer(new ComboBoxRenderer());
    comboCouleurs.addActionListener();	//idem
    
    		texteAccord = new JLabel();
    		texteAccord.setPreferredSize(new Dimension(70, 25));
    		texteAccord.setText("Accord :");
    		
    		comboTons = new JComboBox(tons);
    		comboTons.setPreferredSize(new Dimension(50, 25));
    		//comboTons.setRenderer(new ComboBoxRenderer());
    comboTons.addActionListener();//idem
    		
    		comboModes = new JComboBox(modes);
    		comboModes.setPreferredSize(new Dimension(150, 25));
    		//comboModes.setRenderer(new ComboBoxRenderer());
    comboModes.addActionListener();//idem
    		
    		boutonAccord = new JButton();
    		boutonAccord.setPreferredSize(new Dimension(70, 25));
    		boutonAccord.setText("Valider");
    boutonAccord.addActionListener();//idem
    
    		boutonGamme = new JButton();
    		boutonGamme.setPreferredSize(new Dimension(70, 25));
    		boutonGamme.setText("Valider");
    boutonGamme.addActionListener();//idem
    
    		this.add(texteGamme);
    		this.add(comboNotes); 
    		this.add(comboCouleurs);
    		this.add(boutonGamme);
    		
    		this.add(texteAccord);
    		this.add(comboTons); 
    		this.add(comboModes);
    		this.add(boutonAccord);
    	}
    }
    Enfin rien ne change concernant pan2 qui se trouve dans le post d'avant (AccordPanel).

    Donc, mon problème vient du fais que je ne sais pas comment agir sur pan2 avec les boutons de pan1.

    C'est surement basique comme question, mais les exemples simples que je trouve ici ou ailleurs mettent tout dans le JFrame directement (autant dire qu'avec 15 JPanel ca doit devenir chaotique).


  6. #6
    Membre émérite
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Par défaut
    Pour faire avancer le schmilblik, j'ai vu un sujet qui devrait se rapprocher de ce que je cherche.

    C'est l'EventListenerList. Il permet de faire une file d'evenements. Mais à vrai dire les exemples que j'ai vu sont pour du Java 5 et la grammaire n'est pas reconnu en Java 1.4.2. cf : http://rom.developpez.com/java-listeners/

    De plus je ne sais pas comment appeler les actionPerformed via cette méthode, et enfin je trouve ce concept (utilisation des Threads et de la synchronisation) vraiment très compliqué pour ce que je souhaite faire. N'existe t'il pas une methode se chargeant de cela directement dans les JFrames ??

    Merci d'avance pour vos réponses.

Discussions similaires

  1. Construction efficace de fenêtres (JFrame/JPanel)
    Par Bifidus_Inactif dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 13/05/2008, 08h46
  2. propriétés Jframe, jpanel, etc
    Par skysee dans le forum JDeveloper
    Réponses: 2
    Dernier message: 18/04/2008, 14h32
  3. Problème de placement de composants Jframe, Jpanel
    Par shensi dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 07/02/2008, 14h33
  4. [JPanel]ordre d'affichage JFrame JPanel
    Par cpr0 dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 23/07/2007, 12h46
  5. Mise a jour de l'affichage JFrame-JPanel
    Par aristeas dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 10/06/2006, 10h12

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