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 :

Ajouter une valeur d'un JTextField dans la liste des menuitems


Sujet :

AWT/Swing Java

  1. #1
    Inactif  
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 58
    Points : 53
    Points
    53
    Par défaut Ajouter une valeur d'un JTextField dans la liste des menuitems
    Bonjour

    Je suis en train de développer une application java sur Eclipse. Je construis une fenêtre qui contient un menuBar et un JTextField. Je veux que la valeur de JTextField soit enregistrée dans l'ensemble des menuitems. J'arrive à faire ça mais lors de la prochaine exécution la valeur sera disparu. Voici un bout de code (juste un exemple pour clarifier l'idée puisque le code est trés long) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class choice extends JFrame  {
    	JMenuBar menubar=new JMenuBar();
    JmenuItem hierarchical = new JMenuItem();
    	JtextField tb= new JTextField("kmeans")   ;
    Jmenuitem tba=new Jmenuitem(tb.getText());
    hierarchical.add(tba);
    menubar.add(hierarchical);
    add(menubar)
    }
    Merci par avance de votre aide.

  2. #2
    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 : 55
    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,

    Il faudrait que tu sois plus clair sur ce que tu cherches à faire exactement. Ton code montre juste que tu passes par un JTextField pour générer le texte d'un menu, alors que tu pourrais directement créer ton menu (par Jmenuitem tba=new Jmenuitem("kmeans"); avec la chaîne que tu passes en initialisation du JTextField (vu qu'elle ne risque pas de changer entre la création du field et celle du menu).

    Si le but et d'avoir des menus dont le libellé contient le texte saisie dans le field, il faudrait écouter les changements du texte (on peut le faire par actionListener si les menus en question ne sont pas visible, sinon il faudra le faire sur documentlistener), et répercuter ça sur les menus (donc stocker les instances de menuitem pour pouvoir les traiter à chaque changement).

    Exemple d'implémentation :

    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
    public class DemoMenu {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		List<MenuHandler> handlers = createMenus(frame);
     
    		JTextField field = new JTextField(20);
     
    		JPanel panel = new JPanel();
    		panel.add(field);
     
    		frame.add(panel);
     
     
    		// les menus sont fermés, donc on peut faire le changement sur ActionListener
    		field.addActionListener(e-> updateMenuItem(field.getText(), handlers));
    		// pour mettre à jour les menus, il faut écouter chaque changemen intermédiaire, parce le menu est visible
    		field.getDocument().addDocumentListener(new DocumentListener() {
     
    			@Override
    			public void insertUpdate(DocumentEvent e) {
    				updateMenu(field.getText(), handlers);
    			}
     
    			@Override
    			public void removeUpdate(DocumentEvent e) {
    				updateMenu(field.getText(), handlers);
    			}
     
    			@Override
    			public void changedUpdate(DocumentEvent e) {
    				updateMenu(field.getText(), handlers);
    			}
     
    		});
     
    		// on met à jour dés le début
    		updateMenu(field.getText(), handlers);
    		updateMenuItem(field.getText(), handlers);
     
    		frame.setSize(300,200);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
     
    	private static void updateMenuItem(String texte, List<MenuHandler> handlers) {
    		for(MenuHandler menuHandler : handlers) {
    			menuHandler.updateMenuItem(texte);
    		}
    	}
     
     
    	protected static void updateMenu(String texte, List<MenuHandler> handlers) {
    		for(MenuHandler menuHandler : handlers) {
    			menuHandler.updateMenu(texte);
    		}
    	}
     
     
    	private static List<MenuHandler> createMenus(JFrame frame) {
    		List<MenuHandler> menus = new ArrayList<>();
     
    		JMenuBar menuBar = new JMenuBar();
     
    		JMenu menu = new JMenu("Un menu");
    		menuBar.add(menu);
    		menus.add(new MenuHandler("Un menu {0}", menu));
     
    		JMenuItem menuItem1 = new JMenuItem("Un menu item");
    		menu.add(menuItem1);
    		menus.add(new MenuHandler("Un menu item {0}", menuItem1));
     
    		JMenuItem menuItem2 = new JMenuItem("Un autre menu item");
    		menu.add(menuItem2);
    		menus.add(new MenuHandler("{0} est dans l''autre menu item", menuItem2));
     
    		JMenuItem menuItem3 = new JMenuItem("Un autre menu item qui ne contiendra pas le texte");
    		menu.add(menuItem3);
     
    		frame.setJMenuBar(menuBar);
    		return menus;
    	}
     
     
    	public static class MenuHandler {
     
    		private JMenuItem menuItem;
    		private String pattern;
     
    		public MenuHandler(String pattern, JMenuItem menuItem) {
    			this.menuItem=menuItem;
    			this.pattern=pattern;
    		}
     
    		public void updateMenuItem(String texte) {
    			if ( !(menuItem instanceof JMenu) ) {
    				menuItem.setText( MessageFormat.format(pattern, new Object[]{ texte}));
    			}
    		}
     
    		public void updateMenu(String texte) {
    			menuItem.setText( MessageFormat.format(pattern,new Object[]{ texte}));
    		}
     
    	}
     
    }

  3. #3
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Bonjour,

    D'apres ce que je comprends, tu veux que ton menu gardes les elements que tu as inséré lorsque tu fermes et ouvres une nouvelle fois ton application ?
    Si oui, il faut sauvegarder les changements en question et charger au demarrage de l'application. Et si tu veux savoir comment faire, je dirais que le plus simple est de nous dire comment tu peuples le menu pour l'instant (ca vient d'un fichier texte ? D'une BDD ?) et de faire pareil.

  4. #4
    Inactif  
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 58
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Bonjour,
    merci joel.drigo et hwoarang pour votre réponse.c'est exactement ce que je veux hwoarang.je veux que la valeur que JTextField soit enregistré definitivement dans la liste des menuitems et la présence de JtextField est obligatoire dans mon Jframe.l'affichage de menu est statique.je n'utilise ni une BD ni un fichier xml pour l'instant

  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 : 55
    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
    Ce que je comprends c'est que tu cherches à faire une sorte de MRU : toute valeur saisie dans le JTextField s'ajoute comme menu, que ces menus s'affichent même quand on relance l'application. C'est donc un mixte de ce que je t'ai indiquée et de ce qu'indique @hwoarang. A chaque validation de saisie (que actionPerformed) il faut sauvegarder d'une manière ou d'une autre le texte, et créé un menu. Au lancement de l'application, il faut lire les données sauvegardées et créer les menus correspondants.

    Par exemple, en sauvant les saisies dans un simple fichier texte, à raison d'une saisie par ligne :
    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
    public class DemoMenu {
     
    	private static final Path FICHIER = Paths.get("savedmenus.xxx");
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		List<String> savedMenus;
    		if ( Files.exists(FICHIER) ) {
    			try { 
    				savedMenus = Files.readAllLines(FICHIER, StandardCharsets.UTF_8);
    			} catch (IOException e) {
    				throw new RuntimeException(e);
    			}
    		}
    		else {
    			savedMenus = new ArrayList<String>();
    		}
     
    		JMenu menu = createMenus(frame, savedMenus);
     
    		JTextField field = new JTextField(20);
     
    		JPanel panel = new JPanel();
    		panel.add(new JLabel("Saisir un texte et appuyer entrée : "));
    		panel.add(field);
     
    		frame.add(panel);
     
     
    		field.addActionListener(e-> createAndSaveMenuItem(field.getText(), menu, savedMenus)); 
     
    		frame.setSize(300,200);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	private static void createAndSaveMenuItem(String texte, JMenu menu, List<String> savedMenus) {
    		Objects.requireNonNull(texte);
    		Objects.requireNonNull(menu);
    		Objects.requireNonNull(savedMenus);
    		if ( texte.isEmpty() ) return;
    		if ( savedMenus.isEmpty() ) {
    			menu.addSeparator();
    		}
    		createMenuItem(texte, menu);
    		// on peut limiter le nombre de menus conservés
    		if ( savedMenus.size()>10 ) {
    			savedMenus.remove(0);
    		}
    		savedMenus.add(texte);
    		try {
    			Files.write(FICHIER, savedMenus, StandardCharsets.UTF_8);
    		} catch (IOException e) {
    			throw new RuntimeException(e);
    		}
    	}
     
    	private static void createMenuItem(String label, JMenu menu) {
    		 JMenuItem menuItem = new JMenuItem(label);
    		 // ...
    		 menu.add(label);
    	} 
     
     
    	private static JMenu createMenus(JFrame frame, List<String> savedMenus) {
     
    		JMenuBar menuBar = new JMenuBar();
     
    		JMenu menu = new JMenu("Menu");
    		menuBar.add(menu);
     
    		JMenuItem menuItemX = new JMenuItem("Menu item quelconque");
    		menu.add(menuItemX);
     
    		if ( !savedMenus.isEmpty() ) {
    			menu.addSeparator();
    			savedMenus.stream()
    			          .forEach(s-> createMenuItem(s, menu));
    		}
     
    		frame.setJMenuBar(menuBar);
    		return menu;
     
    	} 
     
    }

  6. #6
    Inactif  
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 58
    Points : 53
    Points
    53
    Par défaut
    merci bien Joel.
    si je tape le code j'ai obtenu des erreurs au niveau de ces deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    field.addActionListener(e-> createAndSaveMenuItem(field.getText(), menu, savedMenus)); 
    et .forEach(s-> createMenuItem(s, menu));
    //l'erreur:s can not be resolved to a variable.
    merci de m'expliquer le source de l'erreur

  7. #7
    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 : 55
    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
    Probablement, parce que tu es en Java 7 et que mon code est en Java 8.

    Voici la version Java 7 (je n'ai pas pu la tester, je n'ai plus Java 7 sur mon poste, mais je ne crois pas avoir oublier quelque chose) :

    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
    public class DemoMenu {
     
    	private static final Path FICHIER = Paths.get("savedmenus.xxx");
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		final List<String> savedMenus;
    		if ( Files.exists(FICHIER) ) {
    			try { 
    				savedMenus = Files.readAllLines(FICHIER, StandardCharsets.UTF_8);
    			} catch (IOException e) {
    				throw new RuntimeException(e);
    			}
    		}
    		else {
    			savedMenus = new ArrayList<String>();
    		}
     
    		final JMenu menu = createMenus(frame, savedMenus);
     
    		JTextField field = new JTextField(20);
     
    		JPanel panel = new JPanel();
    		panel.add(new JLabel("Saisir un texte et appuyer entrée : "));
    		panel.add(field);
     
    		frame.add(panel);
     
     
    		field.addActionListener(new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				createAndSaveMenuItem(field.getText(), menu, savedMenus);
    			}
     
    		}); 
     
    		frame.setSize(300,200);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	private static void createAndSaveMenuItem(String texte, JMenu menu, List<String> savedMenus) {
    		Objects.requireNonNull(texte);
    		Objects.requireNonNull(menu);
    		Objects.requireNonNull(savedMenus);
    		if ( texte.isEmpty() ) return;
    		if ( savedMenus.isEmpty() ) {
    			menu.addSeparator();
    		}
    		createMenuItem(texte, menu);
    		// on peut limiter le nombre de menus conservés
    		if ( savedMenus.size()>10 ) {
    			savedMenus.remove(0);
    		}
    		savedMenus.add(texte);
    		try {
    			Files.write(FICHIER, savedMenus, StandardCharsets.UTF_8);
    		} catch (IOException e) {
    			throw new RuntimeException(e);
    		}
    	}
     
    	private static void createMenuItem(String label, JMenu menu) {
    		 JMenuItem menuItem = new JMenuItem(label);
    		 // ...
    		 menu.add(label);
    	} 
     
     
    	private static JMenu createMenus(JFrame frame, List<String> savedMenus) {
     
    		JMenuBar menuBar = new JMenuBar();
     
    		JMenu menu = new JMenu("Menu");
    		menuBar.add(menu);
     
    		JMenuItem menuItemX = new JMenuItem("Menu item quelconque");
    		menu.add(menuItemX);
     
    		if ( !savedMenus.isEmpty() ) {
    			menu.addSeparator();
    			for(String savedMenu : savedMenus) {
    				createMenuItem(savedMenu, menu);
    			}
    		}
     
    		frame.setJMenuBar(menuBar);
    		return menu;
     
    	} 
     
    }

  8. #8
    Inactif  
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 58
    Points : 53
    Points
    53
    Par défaut
    ça marche très bien et c'est exactement ce que je veux.Un grand merci Joel

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

Discussions similaires

  1. ajouter la valeur d'un jTextfield dans ma base
    Par norkoffire dans le forum Composants
    Réponses: 6
    Dernier message: 16/06/2007, 17h28
  2. bouton ajouter une valeur dans un valeur
    Par nykola7 dans le forum Access
    Réponses: 4
    Dernier message: 08/09/2006, 14h58
  3. Ajouter une valeur dans un listview
    Par aliwassem dans le forum Composants VCL
    Réponses: 1
    Dernier message: 25/01/2006, 23h15
  4. VBA : ajouter une valeur dans une liste déroulante
    Par remi59 dans le forum Access
    Réponses: 4
    Dernier message: 22/12/2005, 11h01
  5. ajouter une valeur dans une combobox
    Par decour dans le forum Access
    Réponses: 1
    Dernier message: 17/10/2005, 11h58

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