1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    mai 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2017
    Messages : 41
    Points : 13
    Points
    13

    Par défaut JTree: Problème de modification

    Je créé un JTree représentant différentes tables que l'utilisateur créé. Il doit pouvoir modifier, supprimer, ajouter des tables attributs et tuples. Voici mon code pour la classe s'occupant des modifications du JTree:

    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
     
    	public Fenetre(String nom){
    		super(nom);
    		panel = new JPanel();
    		panel.setLayout(new BorderLayout());
    		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
    		this.centre = new Centre();
    		this.connexion = new Connexion();
    		this.cardLayout = new CardLayout();
    		this.myActionListener = new MyActionListener(centre,connexion,this);
    		this.myDocumentListener = new MyDocumentListener(centre);
    		this.control = new Control(centre,connexion,myActionListener,this,myDocumentListener);
    		myActionListener.addControl(control);
    		myDocumentListener.addControl(control);
     
    		buildTree();
    		DefaultTreeCellRenderer myRenderer = new DefaultTreeCellRenderer(); 
    		// Changement de l'icône pour les feuilles de l'arbre. 
    		myRenderer.setLeafIcon(new ImageIcon("./add.png")); 
    		// Changement de l'icône pour les nœuds fermés. 
    		myRenderer.setClosedIcon(new ImageIcon("closedBookIcon.png")); 
    		// Changement de l'icône pour les nœuds ouverts. 
    		myRenderer.setOpenIcon(new ImageIcon("openBookIcon.png")); 
    		// Application de l'afficheur à l'arbre. 
    		arbre.setCellRenderer(myRenderer);
     
    		panel.add(centre,BorderLayout.CENTER);
    		arbre.setPreferredSize(new Dimension(300,750));
    		panel.add(arbre,BorderLayout.WEST);
    		menuBar.add(file);
    		menuBar.add(param);
    		menuBar.add(jeu);
     
    		this.menuItem1.setBackground(new Color(253,147,198));
    		this.menuItem2.setBackground(new Color(253,147,198));
    		this.menuItem3.setBackground(new Color(253,147,198));
    		this.menuItem4.setBackground(new Color(253,147,198));
    		this.menuItem5.setBackground(new Color(253,147,198));
    		this.menuItem6.setBackground(new Color(253,147,198));
    		this.menuItem7.setBackground(new Color(253,147,198));
    		this.menuItem8.setBackground(new Color(253,147,198));
    		this.menuItem9.setBackground(new Color(253,147,198));
     
    		file.add(menuItem1);
    		file.add(menuItem2);
    		file.add(menuItem3);
    		file.add(menuItem4);
    		file.add(menuItem5);
     
    		param.add(menuItem6);
    		param.add(menuItem7);
    		param.add(menuItem8);
    		param.add(menuItem9);
     
    		this.menuBar.setBackground(new Color(252,73,158));
    		setJMenuBar(menuBar);
     
    		main = new JPanel (cardLayout);
    		main.add("connexion",connexion);
    		main.add("panel",panel);
    		this.add(main);
    		this.setResizable(false);
    		this.pack();
    		this.setSize(400,250);
    		this.setVisible(true);
    	}
     
    	private void buildTree(){
    	    //Nous créons, avec notre hiérarchie, un arbre
    	    arbre = new JTree(racine);
    	    //Que nous plaçons sur le ContentPane de notre JFrame à l'aide d'un scroll 
    	    this.getContentPane().add(new JScrollPane(arbre));
      	}
     
      	public void addTable(String nomTable){//Marche pour une table
      		DefaultMutableTreeNode nomTable = new DefaultMutableTreeNode(nomTable);
      		racine.add(table);
      		this.repaint();
      		this.setVisible(true);
      	}
     
      	public void addAttibute(String nomTable, String nomAttribut, String type, ArrayList<String> contraintes){
      		DefaultMutableTreeNode attribut = new DefaultMutableTreeNode(nomAttribut);
      		attribut.setParent(nomTable);
      		DefaultMutableTreeNode type = new DefaultMutableTreeNode(type);
      		attribut.add(type);
      		for(String s : contraintes){
      			DefaultMutableTreeNode s = new DefaultMutableTreeNode(s);
      			attribut.add(s);
      		}
      		nomTable.add(attribut);
      	}
    J'ai des erreurs dans addAttribute mais je ne sais pas comment faire pour demander à l'utilisateur de saisir(classe myActionListener) le nom de la table, ses attributs, leurs types et leurs contraintes et créer des DefaultMutableTreeNode et qu'ils s'affichent au fur et à mesure dans mon interface graphique puis les modifier si besoin. DOnc deux questions principales: Faire une méthode permettant de modifier le JTree avec des paramètres String nomAttribut, typeAttribut,.... et comment faire pour ajouter des noeuds à la suite d'une table dont le nom est passé par paramètre? Je sais pas si c'est très clair.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 399
    Points : 24 915
    Points
    24 915
    Billets dans le blog
    2

    Par défaut

    Salut,

    Tu manipuleras plus facilement ton arbre, avec rafraichissement automatique du JTree en passant par le modèle. Si tu utilises le modèle par défaut, DefaultTreeModel, il te faudra déjà écrire une méthode qui retrouve le node correspondant à une table (faire une simple recherche descendante, qui parcourt les childsren à partir de la racine, ou faire un index des notes de table (une Map<String, MutableTreeNode>). La méthode insertNodeInto te permettra d'insérer le node dans son parent, en déclenchant ce qu'il faut comme évenement pour que le JTree se mette à jour.
    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
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    mai 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2017
    Messages : 41
    Points : 13
    Points
    13

    Par défaut

    Et comment fais-t-on un rafraichissement automatique? ^^ Je viens de commencer à utiliser les JTree donc je ne connais pas trop

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 399
    Points : 24 915
    Points
    24 915
    Billets dans le blog
    2

    Par défaut

    Utilises la méthode insertNodeInto et reload sur le node ajouté, ce sera automatique.

    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
    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
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    public class JTreeExemple {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JTree tree = new JTree(new DefaultMutableTreeNode());
    		tree.setRootVisible(false);
    		tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    		frame.add(new JScrollPane(tree));
    		tree.setCellRenderer(new DefaultTreeCellRenderer() { 
    			private static final long serialVersionUID = 1L;
     
    			@Override
    			public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
    					boolean leaf, int row, boolean hasFocus) {
    				if ( value instanceof TypedDefaultMutableTreeNode ) {
    					TypedDefaultMutableTreeNode node = (TypedDefaultMutableTreeNode) value;
    					value = node.getType()+": " + node.getName();
    				}
    				return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
    			}
    		});
     
    		JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
    		buttonPanel.add(createButton("Créer table", e->createTable(tree)));
    		JButton buttonAdd = createButton("Ajouter attribut", e->addAttribute(tree));
    		buttonPanel.add(buttonAdd);
    		buttonAdd.setEnabled(false);
    		frame.add(buttonPanel,BorderLayout.SOUTH);
     
    		tree.addTreeSelectionListener(e->{
    			TreePath path = e.getPath();
    			TypedDefaultMutableTreeNode node = (TypedDefaultMutableTreeNode) path.getLastPathComponent();
    			buttonAdd.setEnabled(node.getType()==NodeType.TABLE);
    		});
     
    		frame.setSize(400, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
    	private static JButton createButton(String name, ActionListener actionListener) {
    		JButton button = new JButton(name);
    		button.addActionListener(actionListener);
    		return button;
    	}
     
    	private static void createTable(JTree tree) {
    		String nomDeLaTable = JOptionPane.showInputDialog(tree,"Nom de la table");
    		if ( nomDeLaTable!=null ) {
    			DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
    			DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
    			TypedDefaultMutableTreeNode node = lookFor(root, NodeType.TABLE, nomDeLaTable);
    			if ( node!=null ) {
    				JOptionPane.showMessageDialog(tree, "Cette table existe déjà");
    			}
    			else {
    				TypedDefaultMutableTreeNode newNode = new TypedDefaultMutableTreeNode(NodeType.TABLE, nomDeLaTable);
    				model.insertNodeInto(newNode, root, root.getChildCount());
    				model.reload(newNode);
    				Object[] path = {root, newNode};
    				tree.setSelectionPath(new TreePath(path));
    			}
    		}
    	}
     
     
    	private static void addAttribute(JTree tree) {
    		TreePath path = tree.getSelectionPath();
    		TypedDefaultMutableTreeNode node = (TypedDefaultMutableTreeNode) path.getLastPathComponent();
    		if (node.getType()==NodeType.TABLE ) {
    			addAttribute(tree, node);
    		}
     
    	}
     
    	private static void addAttribute(JTree tree, TypedDefaultMutableTreeNode tableNode) {
    		JTextField nameField = new JTextField();
    		JTextField valueField = new JTextField();
    		Object[] message = {
    		    "Nom de l'attribut:", nameField,
    		    "Valeur de l'attribut:", valueField
    		};
     
    		int option = JOptionPane.showConfirmDialog(tree, message, "Ajouter un attribut", JOptionPane.OK_CANCEL_OPTION);
    		if (option == JOptionPane.OK_OPTION) {
    		    if ( nameField.getText().trim().isEmpty() ) {
    		    	JOptionPane.showMessageDialog(tree, "Le nom de l'attribut est obligatoire");
    		    } else {
    		    	String name = nameField.getText().trim();
    		    	String value = valueField.getText();
    		    	TypedDefaultMutableTreeNode attributeNode = new TypedDefaultMutableTreeNode(NodeType.ATTRIBUTE, name);
    		    	TypedDefaultMutableTreeNode valueNode = new TypedDefaultMutableTreeNode(NodeType.VALUE, value);
    		    	attributeNode.add(valueNode);
    				DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
    				model.insertNodeInto(attributeNode, tableNode, tableNode.getChildCount());
    				model.reload(attributeNode);
    				Object[] path = {model.getRoot(), tableNode, attributeNode};
    				TreePath treePath = new TreePath(path);
    				tree.setSelectionPath(treePath);
    				tree.expandPath(treePath);
    		    }
    		} 
     
    	}
     
    	private static TypedDefaultMutableTreeNode lookFor(TreeNode parent, NodeType nodeType, String name) {
    		for(int i=0; i<parent.getChildCount(); i++) {
    			TreeNode child = parent.getChildAt(i);
    			if ( child instanceof TypedDefaultMutableTreeNode ) {
    				TypedDefaultMutableTreeNode node = (TypedDefaultMutableTreeNode) child;
    				if ( nodeType!=null && node.getType()!=nodeType ) {
    					continue;
    				}
    				if ( node.getName().equals(name) ) {
    					return node;
    				}
    			}
    			if ( child.getAllowsChildren() && !child.isLeaf() ) {
    				TypedDefaultMutableTreeNode found = lookFor(child, nodeType, name);
    				if ( found!=null ) {
    					return found;
    				}
    			}
    		}
    		return null;
    	}
     
    	public enum NodeType {
    		TABLE(true),
    		ATTRIBUTE(true),
    		VALUE(false);
     
    		private final boolean allowsChildren;
    		private NodeType(boolean allowsChildren) {
    			this.allowsChildren=allowsChildren;
    		}
     
    		public boolean allowsChildren() {
    			return allowsChildren;
    		}
    	}
     
    	public static class TypedDefaultMutableTreeNode extends DefaultMutableTreeNode {
     
    		private static final long serialVersionUID = 1L;
    		private final NodeType type;
     
    		public TypedDefaultMutableTreeNode(NodeType type, String name) {
    			super(name, type.allowsChildren());
    			this.type=type;
    		}
     
    		public NodeType getType() {
    			return type;
    		}
     
    		public String getName() {
    			return (String) getUserObject();
    		}
     
    	}
     
    }
    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.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    mai 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2017
    Messages : 41
    Points : 13
    Points
    13

    Par défaut

    D'accord je vais regarder merci

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    mai 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2017
    Messages : 41
    Points : 13
    Points
    13

    Par défaut

    J'ai fais les changements nécessaires dans mon code mais plusieurs problèmes à l'exécution:
    -Les tables ne s'affichent pas dans l'interface graphique et une enorme erreur est lancée à l'execution avec un null pointer mais je ne vois pas ce qui cloche
    Je ne sais pas si j'ai très bien compris mais pour moi la méthode addAttribute permet d'ajouter un attribut à la dernière table or je voudrais qu'on puisse ajouter des attributs à n'importe quelle table.

    voici mon code au cas ou:

    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
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
     
    public Fenetre(String nom){
    		super(nom);
    		panel = new JPanel();
    		panel.setLayout(new BorderLayout());
    		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
    		this.centre = new Centre();
    		this.connexion = new Connexion();
    		this.cardLayout = new CardLayout();
     
    		buildTree();
    		// Application de l'afficheur à l'arbre. 
    		tree.setCellRenderer(new DefaultTreeCellRenderer() { 
    			private static final long serialVersionUID = 1L;
     
    			@Override
    			public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
    					boolean leaf, int row, boolean hasFocus) {
    				if ( value instanceof TypedDefaultMutableTreeNode ) {
    					TypedDefaultMutableTreeNode node = (TypedDefaultMutableTreeNode) value;
    					value = node.getType()+": " + node.getName();
    				}
    				return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
    			}
    		});
    		tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
     
    		panel.add(centre,BorderLayout.CENTER);
    		tree.setPreferredSize(new Dimension(300,750));
    		panel.add(new JScrollPane(tree),BorderLayout.WEST);
    		menuBar.add(file);
    		menuBar.add(param);
    		menuBar.add(jeu);
     
    		this.menuItem1.setBackground(new Color(253,147,198));
    		this.menuItem2.setBackground(new Color(253,147,198));
    		this.menuItem3.setBackground(new Color(253,147,198));
    		this.menuItem4.setBackground(new Color(253,147,198));
    		this.menuItem5.setBackground(new Color(253,147,198));
    		this.menuItem6.setBackground(new Color(253,147,198));
    		this.menuItem7.setBackground(new Color(253,147,198));
    		this.menuItem8.setBackground(new Color(253,147,198));
    		this.menuItem9.setBackground(new Color(253,147,198));
     
    		file.add(menuItem1);
    		file.add(menuItem2);
    		file.add(menuItem3);
    		file.add(menuItem4);
    		file.add(menuItem5);
     
    		param.add(menuItem6);
    		param.add(menuItem7);
    		param.add(menuItem8);
    		param.add(menuItem9);
     
    		this.menuBar.setBackground(new Color(252,73,158));
    		setJMenuBar(menuBar);
     
    		main = new JPanel (cardLayout);
    		main.add("connexion",connexion);
    		main.add("panel",panel);
    		this.add(main);
    		this.setResizable(false);
    		this.pack();
    		this.setSize(400,250);
    		this.setVisible(true);
    		this.myActionListener = new MyActionListener(centre,connexion,this,tree);
    		this.control = new Control(centre,connexion,myActionListener,this,myDocumentListener);
    		myActionListener.addControl(control);
    		myDocumentListener.addControl(control);
     
    	}
     
    	private void buildTree(){
    	    //Nous créons, avec notre hiérarchie, un arbre
    	    tree = new JTree(racine);
    	    //Que nous plaçons sur le ContentPane de notre JFrame à l'aide d'un scroll 
    	    this.getContentPane().add(new JScrollPane(tree));
      	}
     
      	public  void createTable(JTree tree) {
    		String nomDeLaTable = JOptionPane.showInputDialog(tree,"Nom de la table");
    		if ( nomDeLaTable!=null ) {
    			DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
    			DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
    			TypedDefaultMutableTreeNode node = lookFor(root, NodeType.TABLE, nomDeLaTable);
    			if ( node!=null ) {
    				JOptionPane.showMessageDialog(tree, "Cette table existe déjà");
    			}
    			else {
    				TypedDefaultMutableTreeNode newNode = new TypedDefaultMutableTreeNode(NodeType.TABLE, nomDeLaTable);
    				model.insertNodeInto(newNode, root, root.getChildCount());
    				model.reload(newNode);
    				Object[] path = {root, newNode};
    				tree.setSelectionPath(new TreePath(path));
    			}
    		}
    	}
     
    	public void addAttribute(JTree tree) {
    		TreePath path = tree.getSelectionPath();
    		TypedDefaultMutableTreeNode node = (TypedDefaultMutableTreeNode) path.getLastPathComponent();
    		if (node.getType()==NodeType.TABLE ) {
    			addAttribute(tree, node);
    		}
     
    	}
     
    	private void addAttribute(JTree tree, TypedDefaultMutableTreeNode tableNode) {
    		System.out.println("2");
    		JTextField nameField = new JTextField();
    		JTextField valueField = new JTextField();
    		Object[] message = {
    		    "Nom de l'attribut:", nameField,
    		    "Valeur de l'attribut:", valueField
    		};
     
    		int option = JOptionPane.showConfirmDialog(tree, message, "Ajouter un attribut", JOptionPane.OK_CANCEL_OPTION);
    		if (option == JOptionPane.OK_OPTION) {
    		    if ( nameField.getText().trim().isEmpty() ) {
    		    	JOptionPane.showMessageDialog(tree, "Le nom de l'attribut est obligatoire");
    		    } else {
    		    	String name = nameField.getText().trim();
    		    	String value = valueField.getText();
    		    	TypedDefaultMutableTreeNode attributeNode = new TypedDefaultMutableTreeNode(NodeType.ATTRIBUTE, name);
    		    	TypedDefaultMutableTreeNode valueNode = new TypedDefaultMutableTreeNode(NodeType.VALUE, value);
    		    	attributeNode.add(valueNode);
    				DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
    				model.insertNodeInto(attributeNode, tableNode, tableNode.getChildCount());
    				model.reload(attributeNode);
    				Object[] path = {model.getRoot(), tableNode, attributeNode};
    				TreePath treePath = new TreePath(path);
    				tree.setSelectionPath(treePath);
    				tree.expandPath(treePath);
    		    }
    		} 
     
    	}
     
      	private  TypedDefaultMutableTreeNode lookFor(TreeNode parent, NodeType nodeType, String name) {
    		for(int i=0; i<parent.getChildCount(); i++) {
    			TreeNode child = parent.getChildAt(i);
    			if ( child instanceof TypedDefaultMutableTreeNode ) {
    				TypedDefaultMutableTreeNode node = (TypedDefaultMutableTreeNode) child;
    				if ( nodeType!=null && node.getType()!=nodeType ) {
    					continue;
    				}
    				if ( node.getName().equals(name) ) {
    					return node;
    				}
    			}
    			if ( child.getAllowsChildren() && !child.isLeaf() ) {
    				TypedDefaultMutableTreeNode found = lookFor(child, nodeType, name);
    				if ( found!=null ) {
    					return found;
    				}
    			}
    		}
    		return null;
    	}
     
      	public enum NodeType {
    		TABLE(true),
    		ATTRIBUTE(true),
    		VALUE(false);
     
    		private final boolean allowsChildren;
    		private NodeType(boolean allowsChildren) {
    			this.allowsChildren=allowsChildren;
    		}
     
    		public boolean allowsChildren() {
    			return allowsChildren;
    		}
    	}
     
      	public  class TypedDefaultMutableTreeNode extends DefaultMutableTreeNode {
     
    		private static final long serialVersionUID = 1L;
    		private final NodeType type;
     
    		public TypedDefaultMutableTreeNode(NodeType type, String name) {
    			super(name, type.allowsChildren());
    			this.type=type;
    		}
     
    		public NodeType getType() {
    			return type;
    		}
     
    		public String getName() {
    			return (String) getUserObject();
    		}
     
    	}

    Je doit être aveugle pour ne pas voir d'ou viens mon erreur ^^

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    mai 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2017
    Messages : 41
    Points : 13
    Points
    13

    Par défaut

    voici l'erreur:
    [java] Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException3
    [java]
    [java] at view.Fenetre.createTable(Unknown Source)
    [java] at control.MyActionListener.actionPerformed(Unknown Source)
    [java] at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    [java] at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    [java] at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    [java] at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    [java] at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    [java] at java.awt.Component.processMouseEvent(Component.java:6535)
    [java] at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    [java] at java.awt.Component.processEvent(Component.java:6300)
    [java] at java.awt.Container.processEvent(Container.java:2236)
    [java] at java.awt.Component.dispatchEventImpl(Component.java:4891)
    [java] at java.awt.Container.dispatchEventImpl(Container.java:2294)
    [java] at java.awt.Component.dispatchEvent(Component.java:4713)
    [java] at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
    [java] at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
    [java] at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
    [java] at java.awt.Container.dispatchEventImpl(Container.java:2280)
    [java] at java.awt.Window.dispatchEventImpl(Window.java:2750)
    [java] at java.awt.Component.dispatchEvent(Component.java:4713)
    [java] at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    [java] at java.awt.EventQueue.access$500(EventQueue.java:97)
    [java] at java.awt.EventQueue$3.run(EventQueue.java:709)
    [java] at java.awt.EventQueue$3.run(EventQueue.java:703)
    [java] at java.security.AccessController.doPrivileged(Native Method)
    [java] at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    [java] at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    [java] at java.awt.EventQueue$4.run(EventQueue.java:731)
    [java] at java.awt.EventQueue$4.run(EventQueue.java:729)
    [java] at java.security.AccessController.doPrivileged(Native Method)
    [java] at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    [java] at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    [java] at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    [java] at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    [java] at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    [java] at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    [java] at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    [java] at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 399
    Points : 24 915
    Points
    24 915
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par Akame14 Voir le message
    J'ai fais les changements nécessaires dans mon code mais plusieurs problèmes à l'exécution:
    -Les tables ne s'affichent pas dans l'interface graphique et une enorme erreur est lancée à l'execution avec un null pointer mais je ne vois pas ce qui cloche
    Attention, dans mon exemple, addAttribute n'est appelé que par un bouton qui est actif que s'il y a sélection d'un node TABLE et s'applique justement à la sélection. Si ton myActionListener tu invoques cette méthode sans contrôle, il est possible qu'il n'y ait pas de sélection (donc NullPointerException), et pire, autre chose qu'un node TABLE sélectionné.

    Citation Envoyé par Akame14 Voir le message
    Je ne sais pas si j'ai très bien compris mais pour moi la méthode addAttribute permet d'ajouter un attribut à la dernière table or je voudrais qu'on puisse ajouter des attributs à n'importe quelle table.
    Comme je le disais, ça ne fonctionne que sur le node sélectionné.

    Tu peux modifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void addAttribute(JTree tree) {
    		TreePath path = tree.getSelectionPath();
                    if ( path!=null ) { // s'il y a une sélection
    		   TypedDefaultMutableTreeNode node = (TypedDefaultMutableTreeNode) path.getLastPathComponent();
    		   if (node.getType()==NodeType.TABLE ) {
    			addAttribute(tree, node);
    		   }
                    }
     
    	}
    Attention, là aussi : dans mon exemple, le root n'est pas un TypedDefaultMutableTreeNode, mais ce n'est pas grave, il n'est pas affiché, donc ne peut être sélectionné et le bouton de toute manière ne sera pas activé. Si la méthode addAttribute(JTree) est appelée directement en revanche, on aura un ClassCastException...

    Tu pourrais également faire un méthode qui ajouterait un attribut à une table dans on fournit le nom :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void addAttribute(JTree tree, String nomDeTable) { 
                    DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
    		DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
    		TypedDefaultMutableTreeNode tableNode = lookFor(root, NodeType.TABLE, nomDeLaTable);
    		if ( tableNode !=null ) {
                                  addAttribute(tree, tableNode );
                    }
                    else {
                          throw new IllegalArgumentException("Table "+nomDeLaTable+" non trouvée");		
                    }        
    	}
    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.

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 399
    Points : 24 915
    Points
    24 915
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par Akame14 Voir le message
    voici l'erreur:
    [java] Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException3
    [java]
    [java] at view.Fenetre.createTable(Unknown Source)
    La seule raison que je vois pour qu'on ait une NPE dans createTable, c'est que la racine de l'arbre soit null.
    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.

  10. #10
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    mai 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2017
    Messages : 41
    Points : 13
    Points
    13

    Par défaut

    Ah d'accord et je suis obligée de faire en sorte qu'un node soit selectionné?

  11. #11
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java/Eclipse RCP
    Inscrit en
    septembre 2009
    Messages
    10 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java/Eclipse RCP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 399
    Points : 24 915
    Points
    24 915
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par Akame14 Voir le message
    Ah d'accord et je suis obligée de faire en sorte qu'un node soit selectionné?
    Il faut bien un moyen de choisir sur quelle table on ajoute l'attribut. J'ai fait ça sur la sélection, parce que c'est assez courant, mais on peut le faire de différentes manières. Dans le formulaire de saisir d'attributs, on peut afficher une combo avec le choix de la table par exemple, en modifiant addAttribute(JTree, TypedDefaultMutableTreeNode):

    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
    private static void addAttribute(JTree tree, TypedDefaultMutableTreeNode tableNode) {
    		JTextField nameField = new JTextField();
    		JTextField valueField = new JTextField();
    		JComboBox<String> combo = new JComboBox<>();
    		Object[] message = null;
    		if ( tableNode==null ) {
    			DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
    			DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
     
    			String[] tables = new String[root.getChildCount()];
    			for(int i=0; i<root.getChildCount(); i++) {
    				tables[i] = ((TypedDefaultMutableTreeNode)root.getChildAt(i)).getName();
    			}
     			combo.setModel(new DefaultComboBoxModel<>(tables));
    			message = new Object[]{
    				    "Table:", combo,
    				    "Nom de l'attribut:", nameField,
    				    "Valeur de l'attribut:", valueField
    				};
    		}
    		else {
    			message = new Object[]{
    			    "Nom de l'attribut:", nameField,
    			    "Valeur de l'attribut:", valueField
    			};
    		}
     
    		int option = JOptionPane.showConfirmDialog(tree, message, "Ajouter un attribut", JOptionPane.OK_CANCEL_OPTION);
    		if (option == JOptionPane.OK_OPTION) {
    			if ( tableNode==null ) {
    				String selectedTable = (String)combo.getSelectedItem();
    				if ( selectedTable!=null ) {
    					DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
    					DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
    					tableNode = lookFor(root, NodeType.TABLE, selectedTable);
    				}
    			}
    			if ( tableNode==null ) {
    		    	JOptionPane.showMessageDialog(tree, "Le nom de la table est obligatoire");
    			}
    			else if ( nameField.getText().trim().isEmpty() ) {
    		    	JOptionPane.showMessageDialog(tree, "Le nom de l'attribut est obligatoire");
    		    } else {
    		    	String name = nameField.getText().trim();
    		    	String value = valueField.getText();
    		    	TypedDefaultMutableTreeNode attributeNode = new TypedDefaultMutableTreeNode(NodeType.ATTRIBUTE, name);
    		    	TypedDefaultMutableTreeNode valueNode = new TypedDefaultMutableTreeNode(NodeType.VALUE, value);
    		    	attributeNode.add(valueNode);
    				DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
    				model.insertNodeInto(attributeNode, tableNode, tableNode.getChildCount());
    				model.reload(attributeNode);
    				Object[] path = {model.getRoot(), tableNode, attributeNode};
    				TreePath treePath = new TreePath(path);
    				tree.setSelectionPath(treePath);
    				tree.expandPath(treePath);
    		    }
    		} 
     
    	}
    Si tu appelles cette méthode dans un bouton en passant null en TableNode, une combo s'affichera pour choisir le nom de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buttonPanel.add(createButton("Créer attribut", e->addAttribute(tree, null)));
    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.

  12. #12
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    mai 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2017
    Messages : 41
    Points : 13
    Points
    13

    Par défaut

    D'accord je pense que je vais essayer avec la selection ça m'a l'air plus simple et plus pratique. Je vais changer mon code et je vous préviens si j'ai d'autres soucis merci de votre aide

  13. #13
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    mai 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2017
    Messages : 41
    Points : 13
    Points
    13

    Par défaut

    Ca marche parfaitement merci beaucoup

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

Discussions similaires

  1. [IShellLink] Problème de modification de raccourci
    Par Alcatîz dans le forum Windows
    Réponses: 2
    Dernier message: 17/11/2005, 10h39
  2. Réponses: 19
    Dernier message: 28/10/2005, 18h29
  3. [JTree] Problème d'ouverture de chemin dans un JTree
    Par antares24 dans le forum Arbres
    Réponses: 2
    Dernier message: 11/03/2005, 09h18
  4. [débutant] Problème JSplitPane (modif :InternalFrame)
    Par pingoui dans le forum Fenêtres/Dialogues
    Réponses: 61
    Dernier message: 03/09/2004, 18h01
  5. [JTree]problème de rafraichissement
    Par peppena dans le forum Arbres
    Réponses: 9
    Dernier message: 20/01/2004, 15h06

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