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 :

Une usine pour une création de JCheckBox uniques ?


Sujet :

AWT/Swing Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2017
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Une usine pour une création de JCheckBox uniques ?
    Bonjour,

    Je réalise un petit "atelier maison" qui consiste à envoyer des instructions à des équipements réseau. J'assure la partie communication SSH avec un coup de Python qui sera appelé plus tard (mais là n'est pas le souci, c'est juste pour le contexte :p ).

    Afin de rendre plus convivial cet environnement, j'ai souhaité développer une interface en Java. Je me suis appuyé sur Swing.
    La situation est la suivante :
    • J'ai un fichier contenant les information sur les équipements réseaux ~ adresse et mdp (que le lis)
    • Je souhaite créer une ligne dans mon interface par équipement contenu dans le fichier
    • chaque ligne doit être assortie d'une checkbox afin d'en permettre la selection (et donc d'un listener associé)


    j'arrive à mettre ça en place "graphiquement" parlant mais pas "fonctionnellement". Je m'explique : Je réalise une boucle pour la création de tous ces boutons.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		    for(int i = 1; i<= MonFichier.getLastRowNum(); i++){
     
    		    	MaCheckBox = new CheckBox(HostnameList.get(i).toString());
    		    	MainPanel.add(MaCheckBox );
     
    }
    Ma classe CheckBox est on ne peut plus simpliste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class CheckBox extends JCheckBox {
    	private String name;
    	public CheckBox(String name) {
    		this.name = name;
    		this.setName(name);
     
    	}
    }
    Mon souci : En procédant de la sorte, chaque CheckBox est "écrasée" à chaque occurrence de la boucle. du coup, je n'arrive pas à obtenir d'ID unique celles ci. Du coup impossible d'y associer un listener spécifique avec lequel travailler. N'arrivant pas à créer de nom dynamiquement pour mes CheckBox je me retrouve bien embêté !

    j'ai essayé d'implémenter une Factory mais ça ne semble pas pour autant solver ce souci d'intégrité.

    j'ai parcouru les différentes sections du forum sans pour autant trouver de cas similaire (ou alors j'ai mal cherché ce qui n'est pas exclu !).

    Du coup, ma question : est ce que j'emploie la bonne méthode pour réaliser ce que je souhaite faire ou suis-je dans le faux ?

    J'ajoute que je ne suis pas une bête de compet' non plus en Java et que si mes notions peuvent paraîtres sommaires, elles sont ce qu'elles sont !

    Je suis ouvert à toute question spécifique sur le sujet !

    Merci d'avance !

  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 : 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,

    Citation Envoyé par lemath31 Voir le message
    Mon souci : En procédant de la sorte, chaque CheckBox est "écrasée" à chaque occurrence de la boucle. du coup, je n'arrive pas à obtenir d'ID unique celles ci. Du coup impossible d'y associer un listener spécifique avec lequel travailler. N'arrivant pas à créer de nom dynamiquement pour mes CheckBox je me retrouve bien embêté !
    Déjà il faudrait préciser ce que tu entends par "écrasée", parce que tu ne montres pas beaucoup de code, et ça peut dire pas mal de choses différentes.

    Ensuite, attention, le name d'un composant n'est pas forcément une notion d'id, au sens "identifiant unique de composant". Encore moins un libellé comme ça semble être le cas vu ton code. Il vaut mieux d'ailleurs ne pas l'utiliser, car Swing peut s'en servir de lui même dans certains cas. La référence de l'objet constitue déjà un identifiant, et l'avantage c'est qu'on a accès directement aux méthodes, donc pas d'intermédiaire inutile. Il n'est par ailleurs pas indispensable de faire une classe, mais bon, pourquoi pas. Il n'est pas non plus indispensable d'avoir un écouteur pour une checkbox, à moins que l'interface puisse être modifiée en fonction de la sélection.

    Un exemple rapide, avec le fichier suivant :

    cb1;text 1
    cb2;text 2
    cb3;text 3
    Sur chaque ligne donc, un id et un texte, séparé par un point virgule (c'est un exemple, on peut générer automatiquement des ids aussi on incrémentant un compteur, ou en utilisant une information particulière).

    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
     
    public class Exemple1 {
     
    	public static void main(String[] args) throws IOException {
     
    		Path path = Paths.get("file.txt");
     
     
    		JFrame frame = new JFrame();
     
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		Box checkboxPanel = new Box(BoxLayout.Y_AXIS); // j'utilise un layout en box verticale
     
    		Map<String, JCheckBox> checkboxes = new HashMap<>(); // je stocke mes checkboxes par id
    		for(String line : Files.readAllLines(path)) { // je lis le fichier ligne à ligne
    			String[] data = line.split(";"); // je divise chaque ligne en deux 
    			JCheckBox checkbox = new JCheckBox(data[1]); // je crée une checkbox avec pour texte la deuxième information
    			checkboxes.put(data[0], checkbox); // je stocke ma checkbox avec son identifiant
    			checkboxPanel.add(checkbox); // je place ma checkbox dans l'affichage
                            // un exemple d'écouteur pour réagir au clic
    			checkbox.addActionListener(e->System.out.format("La checkbox %s a été cliquée et sa valeur est %b%n",data[0],checkbox.isSelected()));
    		}
     
     
    		frame.add(new JScrollPane(checkboxPanel)); // je mets mon panel de checkbox dans une fenêtre
     
                    // je créé un bouton
    		JButton button = new JButton("Afficher les boites sélectionnées"); 
                    // j'affecte un écouteur au bouton qui va appeler la méthode afficher
    		button.addActionListener(e-> afficher(checkboxes));
     
                    // je place le bouton en bas de la fenêtre
    		frame.add(button,BorderLayout.SOUTH);
     
    		frame.setSize(300, 300);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
     
    	}
     
    	private static void afficher(Map<String, JCheckBox> checkboxes) {
     
                     // je construis mon affichage		
    		StringBuilder sb = new StringBuilder();
     
    		sb.append("Les checkboxes sélectionnées sont :\n");
    		checkboxes.entrySet().stream().filter(e-> e.getValue().isSelected())
    		          .forEach(e-> sb.append("- ").append(e.getKey()).append(" / ").append(e.getValue().getText()).append("\n"));
     
    		sb.append("\n");
    		sb.append("Les checkboxes non sélectionnées sont :\n");
    		checkboxes.entrySet().stream().filter(e-> !e.getValue().isSelected())
    					.forEach(e-> sb.append("- ").append(e.getKey()).append(" / ").append(e.getValue().getText()).append("\n"));
     
    		JOptionPane.showMessageDialog(null, sb);
     
    	}
     
    }
    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.

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    A noter qu'il serait peut être plus pertinent d'utiliser un JTable pour faire un listing

    En plus, ça tombe bien, la doc sur la JTable explique comment y mettre des checkbox :p

  4. #4
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2017
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Mhmm voila une approche à laquelle je n'avais pas songée...

    Tu utilises une map, j'avais raisonné de la même manière mais ne m'en était pas sorti !

    J'ai tendance à ne pas utiliser les bons termes technique ce qui a le don de me jouer des tours de temps à autres, il faut que je reconsidère ça !

    Je vais essayer une solution proche de celle que tu proposes, je ferai un retour avec un code un peu plus béton si tout fonctionne comme je l'entends !

    Merci beaucoup pour votre temps !

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2017
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    j'ai essayé plusieurs autres solutions, utilsant map, Array et bien d'autres, finalement j'ai dû me retourner vers une version proche de celle proposée par Joël qui fonctionne très bien (extrait du 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
     
    static Map<String, JCheckBox> checkboxes = new HashMap<>();
     
    //Here - push is my Jmenu calling SelectOptions method
    Push.addActionListener(e-> SelectOptions(checkboxes));
     
    for(int i = 1; i<= PWDSheet.getLastRowNum(); i++){
     
                            // HostnameList, AddressList are ArrayLists
    		    	CheckBox checkbox = new CheckBox(list1.get(i).toString()+ " " +list2.get(i).toString());
    		    	checkboxes.put((list1.get(i).toString()), checkbox);  
    		    	MainPanel.add(checkbox);
    }
     
    private  void SelectOptions(Map<String, JCheckBox> checkboxes) {
    		this.checkboxes = checkboxes;
    		//Building display
    		StringBuilder sb = new StringBuilder();
                    //New Windows (fileChooser)
    		SelectionFrame selectionFrame;
    		//for each selected boxes, return Key as String
    		sb.append("Selected devices :\n");
    		checkboxes.entrySet().stream().filter(e-> e.getValue().isSelected()).forEach(e-> sb.append("- ").append(e.getKey()).append("\n"));
    		sb.append("\n");
    		// Call new selection window
    		selectionFrame = new SelectionFrame();
    		JOptionPane.showMessageDialog(null, sb);
    				}
    Encore merci à Joël pour le tuyau !

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

Discussions similaires

  1. [AC-2010] Récupérer une donnée dans une cellule pour une variable
    Par zooffy dans le forum VBA Access
    Réponses: 5
    Dernier message: 27/06/2017, 16h58
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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