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

Interfaces Graphiques en Java Discussion :

comment gérer l'ordre des évènement


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 95
    Points : 56
    Points
    56
    Par défaut comment gérer l'ordre des évènement
    Bonjour,

    j'ai créé une interface graphique dans laquelle il y a un Jtree, des boutons servant d'opérateur, et un champ de texte. L'idée, grosso modo, c'est de donner la possibilité aux utilisateurs de créer des opérations avec les éléments du JTRee. Pour cela, l'utilisateur dois d'abbord selectionner un item de l'arbre et selecctionner un opérateur.

    J'ai donc besoin de vous car je ne sais pas comment gérer l'ordre des évènements.
    C'est à dire que si l'utilisateur n'a pas sélectionner au préalable un élément de l'arbre, il ne peut pas choisir un opérateur.

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

    Le plus simple c'est de rendre la sélection d'opérateur impossible tant qu'un élément de l'arbre n'est pas sélectionné (avec setEnabled()). De toute manière, pour gérer cette notion d'ordre des événements, tu seras obligé d'avoir un booléen (ou utiliser la valeur null) pour savoir qu'on a sélectionné un élément dans l'arbre au moment de la sélection de l'opérateur, donc ça revient au même, sauf qu'au lieu d'afficher un message "sélectionner d'abord un truc dans l'arbre" au moment de la sélection de l'opérateur, la sélection de l'opérateur ne sera pas faisable, ce qui est moins gênant au niveau ergonomie (tu peux toujours afficher un warning dans le fond avec "sélectionner d'abord un élément pour sélectionner l'opérateur".

    Une autre solution qui me semble meilleur niveau ergonomique est d'afficher des pages alternatives : d'abord une avec l'arbre, ensuite avec l'opérateur, ensuite avec l'arbre, puis avec l'opérateur, etc. Avec un CardLayout, c'est très simple. Et on peut même gérer un ordre différent au besoin : si tu as un champ texte pour saisir la formule, en parsant la formule au fur et à mesure de la frappe, tu peux déterminer s'il faut afficher l'un ou l'autre.

    Tu peux aussi ne pas gérer d'ordre, et prévoir le déclenchement lorsque les deux sont sélectionnés, sur un bouton à part (genre "ajouter"). Tout dépend du composant pour l'opérateur : si c'est une JList par exemple, c'est plutôt simple. Avec un bouton c'est plus problématique.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 95
    Points : 56
    Points
    56
    Par défaut
    Merci pour ta réponse, et désolé pour ma réponse si tardive.
    En fait, dans mon cas, j'ai un JTREE et plusiseur boutons. J'aimerais en fait sélectionner un elément du JTREE si et seulement si, j'ai cliqué sur un bouton juste avant... et afficher le tout petit à petit dans un JTextArea.

    Exemple de ce que jeux obtenir : A + B * C .....

    Du coup j'aimerai savoir s'il est possible de créer q'un seul listener pour toutes mes action ? Et peu importe la réponse, comment faire pour savoir si un objet à déjà été sélectionné ?

    Je suis en train d'apprendre le JAVA j'ai donc quelques difficultés encore pour tout assimilé, notamment la gestion des évenements... Merci

  4. #4
    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
    Citation Envoyé par Miigui Voir le message
    J'aimerais en fait sélectionner un elément du JTREE si et seulement si, j'ai cliqué sur un bouton juste avant...
    Dans ce cas, c'est juste l'inverse, c'est le JTree qui n'est pas "enabled" alors que le bouton l'est, à part au début.

    Exemple de ce que jeux obtenir : A + B * C .....

    Citation Envoyé par Miigui Voir le message
    Du coup j'aimerai savoir s'il est possible de créer q'un seul listener pour toutes mes action ?
    On peut faire qu'une seule classe, mais elle devra de toute manière écouter tous les composants. Le souci c'est surtout qu'il faut penser à désactiver la sélection dans l'arbre sinon on ne peut pas mettre deux fois de suite le même élément (c'est le souci avec ce mode par sélection).


    Citation Envoyé par Miigui Voir le message
    Et peu importe la réponse, comment faire pour savoir si un objet à déjà été sélectionné ?
    ça dépend :
    1. Méthode getSelectedPath() par exemple.
    2. Dans la méthode de l'écouteur TreeSelectionListener, on a directement accès à la sélection ( getPath() ).


    Citation Envoyé par Miigui Voir le message
    Je suis en train d'apprendre le JAVA j'ai donc quelques difficultés encore pour tout assimilé, notamment la gestion des évenements... Merci
    Un événement est déclenché par le système lorsqu'il se passe quelque chose, et que ce quelque chose dénote d'un changement (avec la sélection, une resélection ne déclenchera pas de sélection). Les événements sont indépendants les uns des autres, et il n'y a pas de notion d'ordre autre que le temps. Mais on peut faire un système de redispatch basé sur une liste ou une pile, qui te permettrait de gérer une notion d'ordre, mais ça ne simplifierait pas grand chose. La problématique avec la sélection c'est qu'il existe une notion de "désélection". Dans ton interface, cette notion n'existe plus : ton arbre fonctionne en quelque sorte comme un arbre de boutons. On pourrait aussi éventuellement faire ça, mais ce n'est pas simple pour un débutant, c'est même plutôt siouxe pour avoir un rendu qui ressemble vraiment à des boutons (voir les notions de CellRenderer et CellEditor).

    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
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.event.ActionListener;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTree;
    import javax.swing.event.TreeSelectionListener;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.TreeNode;
    import javax.swing.tree.TreeSelectionModel;
     
    public class Exemple1 {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Exemple");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JTree tree = new JTree(new DefaultTreeModel(createTree()));
    		tree.setRootVisible(false);
    		tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    		for (int i = 0; i < tree.getRowCount(); i++) {
    		    tree.expandRow(i);
    		}
    		tree.setVisibleRowCount(10);
     
    		JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
     
    		JButton buttonPlus = new JButton("+");
    		buttonPlus.setActionCommand("+");
    		JButton buttonMinus = new JButton("-");
    		buttonMinus.setActionCommand("-");
     
    		List<JButton> buttonList = Arrays.asList(buttonPlus, buttonMinus);
    		buttonList.forEach(button-> buttonPanel.add(button));
    		buttonList.forEach(button-> button.setEnabled(false));
     
    		JPanel panel = new JPanel(new BorderLayout());
     
    		JTextArea textArea = new JTextArea();
    		textArea.setLineWrap(true);
    		textArea.setEditable(false);
    		textArea.setPreferredSize(new Dimension(300, 150));
     
    		JPanel treePanel = new JPanel(new BorderLayout());
    		treePanel.add(new JScrollPane(tree));
     
    		panel.add(treePanel,BorderLayout.NORTH);
    		panel.add(buttonPanel);
    		panel.add(new JScrollPane(textArea,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER),BorderLayout.SOUTH);
     
    		frame.add(panel);
     
    		ActionListener buttonAction = e-> {
    			if ( textArea.getText().length()>0 ) {
    				textArea.append(" ");
    			}
    			textArea.append(e.getActionCommand());
    			tree.setEnabled(true);
    			buttonList.forEach(button-> button.setEnabled(false));
    		};
    		buttonList.forEach(button-> button.addActionListener(buttonAction));
     
    		TreeSelectionListener treeSelectionListener = e-> {
    			DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
    			if ( e.isAddedPath() && node.isLeaf() ) { // on ne réagit que si on sélectionne une feuille
    				if ( textArea.getText().length()>0 ) {
    					textArea.append(" ");
    				}
    				textArea.append(node.getUserObject().toString());
    				tree.setEnabled(false);
    				buttonList.forEach(button-> button.setEnabled(true));
    				tree.setSelectionPaths(null); // on supprime la sélection pour permettre de sélectionner à nouveau le même élément
    			}
    		};
    		tree.addTreeSelectionListener(treeSelectionListener);
     
     
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
     
    	}
     
    	private static TreeNode createTree() {
    		String[] values = {
    				"a.b.A",
    				"a.b.B",
    				"c.C",
    				"c.d.D",
    				"c.d.E"
    		};
    		DefaultMutableTreeNode root = new DefaultMutableTreeNode();
    		Map<String, DefaultMutableTreeNode> map = new HashMap<>();
    		StringBuilder path = new StringBuilder();
    		map.put("", root);
    		for(String value : values) {
    			String[] treePath = value.split("\\.");
    			add(root, path, map, treePath, 0);
    		}
    		return root;
    	}
     
    	private static void add(DefaultMutableTreeNode parentNode, StringBuilder path, Map<String, DefaultMutableTreeNode> map,
    			String[] treePath, int depth) {
    		if ( depth<treePath.length ) {
    			int length = path.length();
    			if ( depth!=0 ) {
    				path.append('.');
    			}
    			path.append(treePath[depth]);
    			DefaultMutableTreeNode currentNode = map.get(path.toString());
    			if ( currentNode==null ) {
    				currentNode = new DefaultMutableTreeNode(treePath[depth]);
    				parentNode.add(currentNode);
    				map.put(path.toString(), currentNode);
    			}
    			add(currentNode, path, map, treePath, depth+1);
    			path.setLength(length); // pop
    		}
    	}
     
    }
    Un exemple avec cardlayout :
    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
    import java.awt.BorderLayout;
    import java.awt.CardLayout;
    import java.awt.Dimension;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import java.awt.event.ActionListener;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTree;
    import javax.swing.event.TreeSelectionListener;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.TreeNode;
    import javax.swing.tree.TreeSelectionModel;
     
    public class Exemple2 {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Exemple");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JTree tree = new JTree(new DefaultTreeModel(createTree()));
    		tree.setRootVisible(false);
    		tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    		for (int i = 0; i < tree.getRowCount(); i++) {
    		    tree.expandRow(i);
    		}
    		tree.setVisibleRowCount(10);
     
    		JPanel buttonPanel = new JPanel(new GridBagLayout());
     
    		JButton buttonPlus = new JButton("+");
    		buttonPlus.setActionCommand("+");
    		JButton buttonMinus = new JButton("-");
    		buttonMinus.setActionCommand("-");
     
    		List<JButton> buttonList = Arrays.asList(buttonPlus, buttonMinus);
    		GridBagConstraints gbc = new GridBagConstraints();
    		gbc.insets = new Insets(0, 0, 5, 0);
    		gbc.gridx=0;
    		gbc.gridy=GridBagConstraints.RELATIVE;
    		gbc.fill=GridBagConstraints.HORIZONTAL;
    		buttonList.forEach(button-> buttonPanel.add(button,gbc));
     
    		JPanel panel = new JPanel(new BorderLayout());
     
    		JTextArea textArea = new JTextArea();
    		textArea.setLineWrap(true);
    		textArea.setEditable(false);
    		textArea.setPreferredSize(new Dimension(300, 150));
     
    		JPanel treePanel = new JPanel(new BorderLayout());
    		treePanel.add(new JScrollPane(tree));
     
    		CardLayout cardLayout = new CardLayout();
    		JPanel mainPanel = new JPanel(cardLayout);
    		mainPanel.add(treePanel,"tree");
    		mainPanel.add(buttonPanel,"operators");
    		cardLayout.show(mainPanel, "tree");
     
    		panel.add(mainPanel);
    		panel.add(new JScrollPane(textArea,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER),BorderLayout.SOUTH);
     
    		frame.add(panel);
     
    		ActionListener buttonAction = e-> {
    			if ( textArea.getText().length()>0 ) {
    				textArea.append(" ");
    			}
    			textArea.append(e.getActionCommand());
    			cardLayout.show(mainPanel, "tree");
     
    		};
    		buttonList.forEach(button-> button.addActionListener(buttonAction));
     
    		TreeSelectionListener treeSelectionListener = e-> {
    			DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
    			if ( e.isAddedPath() && node.isLeaf() ) { 
    				if ( textArea.getText().length()>0 ) {
    					textArea.append(" ");
    				}
    				textArea.append(node.getUserObject().toString());
    				cardLayout.show(mainPanel, "operators");
    				tree.setSelectionPaths(null);
    			}
    		};
    		tree.addTreeSelectionListener(treeSelectionListener);
     
     
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
     
    	}
     
    	private static TreeNode createTree() {
    		String[] values = {
    				"a.b.A",
    				"a.b.B",
    				"c.C",
    				"c.d.D",
    				"c.d.E"
    		};
    		DefaultMutableTreeNode root = new DefaultMutableTreeNode();
    		Map<String, DefaultMutableTreeNode> map = new HashMap<>();
    		StringBuilder path = new StringBuilder();
    		map.put("", root);
    		for(String value : values) {
    			String[] treePath = value.split("\\.");
    			add(root, path, map, treePath, 0);
    		}
    		return root;
    	}
     
    	private static void add(DefaultMutableTreeNode parentNode, StringBuilder path, Map<String, DefaultMutableTreeNode> map,
    			String[] treePath, int depth) {
    		if ( depth<treePath.length ) {
    			int length = path.length();
    			if ( depth!=0 ) {
    				path.append('.');
    			}
    			path.append(treePath[depth]);
    			DefaultMutableTreeNode currentNode = map.get(path.toString());
    			if ( currentNode==null ) {
    				currentNode = new DefaultMutableTreeNode(treePath[depth]);
    				parentNode.add(currentNode);
    				map.put(path.toString(), currentNode);
    			}
    			add(currentNode, path, map, treePath, depth+1);
    			path.setLength(length); // pop
    		}
    	}
     
    }

Discussions similaires

  1. Comment gérer l'ordre d'affichage des composants ?
    Par sterna dans le forum Composants VCL
    Réponses: 2
    Dernier message: 03/04/2011, 13h32
  2. Réponses: 3
    Dernier message: 19/05/2006, 12h05
  3. Réponses: 2
    Dernier message: 24/03/2006, 11h18
  4. gérer l'ordre des tabulations dans un formulaire
    Par amigauss dans le forum Langage
    Réponses: 11
    Dernier message: 17/01/2006, 11h43

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