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 :

erreur dans l'apparence de ma ligne créée


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    ingénieur télécom
    Inscrit en
    Février 2017
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ingénieur télécom
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2017
    Messages : 54
    Points : 27
    Points
    27
    Par défaut erreur dans l'apparence de ma ligne créée
    Bonjour ,
    j'ai des problèmes dans mon code et je n'arrive pas a les rècupérer , en fait je veux que le code me fais dessiner une ligne aprés qu'il release la souris il s'affiche une liste des élément et enfin la ligne dessiné avec la souris est effacé et il s'affiche une ligne réglé en fonction de anchor.x et currenttpoint.x
    les lignes que la méthode dessine doivent ètre conserver
    voici mon code , merci d'avance
    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
      import java.awt.Graphics;
    import java.awt.Color;
    import java.awt.Point;
    import java.applet.AudioClip;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
     
    public class mouse1 extends java.applet.Applet
            implements MouseListener, MouseMotionListener {
    	public mouse1() {
    	}
        private final int MAXLINES = 100;
        private Point[] starts;
        private Point[] ends;
        private Point anchor;
        private Point currentpoint;
        private int currlines;
        private AudioClip tooMany;
     
    //  allocate the array of Points, set the background color, load the error sound
     
        public void init() {
            starts = new Point[MAXLINES];
            ends = new Point[MAXLINES];
            setBackground(Color.white);
            currlines = 1;
          //  tooMany = getAudioClip(getCodeBase(),"bong.au");
            this.addMouseListener(this);
            this.addMouseMotionListener(this);
     
     
        }
     
    //  start a new line when the user depresses the mouse
     
        public void mousePressed(MouseEvent e)
        {
            anchor = new Point(e.getX(),e.getY());
            repaint();
           ;
     
     
        }
     
    //  draw the potential line as the user drags the mouse around
     
        public void mouseDragged(MouseEvent e)
        {
            currentpoint = new Point(e.getX(),e.getY());
            repaint();
        }
        public void mouseMoved(MouseEvent e) { }
     
    //  add the new line when the user releases the mouse button
     
        public void mouseReleased(MouseEvent e)
        {
            if (currlines < MAXLINES)
                {addline(e.getX(),e.getY());
           }
            else {
                tooMany.play();
                currentpoint = null;
                repaint();
            }
        }
        public void mouseClicked(MouseEvent e) { }
        public void mouseEntered(MouseEvent e) { }
        public void mouseExited(MouseEvent e) { }
     
        void addline(int x, int y) {
            starts[currlines] = anchor;
            ends[currlines] = currentpoint;
            currlines++;
            currentpoint = null;
            repaint();
     
     
        }
     
    // the existing lines, then draw the potential line in blue
     
        public void paint(Graphics g) {
        	int ystart=50;
            int marg=10;
                //premier
                g.drawRect(25, 30, 50, 20);
                g.drawString("UE", 42, 45);
                for(int i=1;i<=20;i++)
                {g.drawLine(50,marg*(i-1)+i*ystart, 50, marg*(i-1)+(i+1)*ystart);}
     
                //deuxieme         
                g.drawRect(175, 30, 50, 20);
                g.drawString("NodeB", 182, 45);
                for(int i=1;i<=20;i++)
                {g.drawLine(200,marg*(i-1)+i*ystart, 200, marg*(i-1)+(i+1)*ystart);}
     
                //troisieme        
                g.drawRect(325, 30, 50, 20);  
                for(int i=1;i<=20;i++)
                {g.drawLine(350,marg*(i-1)+i*ystart, 350, marg*(i-1)+(i+1)*ystart);}
                g.drawString("SRNC", 333, 45);
     
                //quatrieme        
                g.drawRect(475, 30, 50, 20);        
                for(int i=1;i<=20;i++)
                {g.drawLine(500,marg*(i-1)+i*ystart, 500, marg*(i-1)+(i+1)*ystart);}
                g.drawString("DRNC", 483, 45);
     
                //cinquieme
                g.drawRect(625, 30, 50, 20);
                for(int i=1;i<=20;i++)
                {g.drawLine(650,marg*(i-1)+i*ystart, 650, marg*(i-1)+(i+1)*ystart);}
                g.drawString("CN", 640, 45);
        	 g.setColor(Color.blue);
            for (int i = 0 ; i < currlines ; i++)
            { //g.drawLine(starts[i].x,starts[i].y,ends[i].x,ends[i].y);
     
     
            int y=55;
     
     
     
        if (anchor.x>40 && anchor.x<60 && (currentpoint.x>340 && currentpoint.x<360)){  
     
        g.setColor(Color.blue);
        	 new jliste();
       y=y+60;
        	g.drawLine(50, y, 350, y);
     
        }
     
        else if (anchor.x>190 && anchor.x<200 && (currentpoint.x>340 && currentpoint.x<360)){  
     
        g.setColor(Color.blue);
        	 new jliste();
        	 y=y+60;
        	g.drawLine(200,y, 350, y);
     
        }
        else if (anchor.x>340 && anchor.x<360 && (currentpoint.x>490 && currentpoint.x<510)){  
     
            g.setColor(Color.blue);
            	 new jliste();
            	 y=y+60;
            	g.drawLine(350,y, 500, y);
     
            }
     else if (anchor.x>340 && anchor.x<360 && (currentpoint.x>640 && currentpoint.x<660)){  
     
            g.setColor(Color.blue);
            	 new jliste();
            	 y=y+60;
            	g.drawLine(350,y, 650, y);
     
            }
     
        g.drawLine(anchor.x,anchor.y,currentpoint.x,currentpoint.y);
     
     
            } }
     
        }

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 265
    Points : 181
    Points
    181
    Par défaut re
    Bonjour, les seuls conseils que je peux te donner, c'est de tracer, loguer l'appel aux evennements
    avec des System.out.println("evenementA" );
    ...
    Voir si tu passes dedans, vérifier les valeurs...

    Si tu as un moyen de positionner des points d'arret au niveau des tes evenements, tu me déboguer et tracer toutes les variables...
    Bon courage.


  3. #3
    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,

    Tu as 3 problèmes :

    1. Les indices de tableau vont de 0 à la taille du tableau - 1
      En initialisant currlines à 1, lorsque la boucle for (int i = 0 ; i < currlines ; i++) s'exécute, on parcourt le tableau et on accède à starts[0] et ends[0], qui sont à null, d'où NullPointerException lorsqu'on accède à leur x et y. On la voit clairement en console et on voit exactement où elle survient, ce qui aurait dû te mettre sur la piste.
    2. De la même façon, après avoir corrigé l'initialisation de currlines, tu vas avoir une NullPointerException avec currentpoint, dès que tu auras au moins créé une ligne. En effet, lorsqu'on n'est pas en train de tracer une ligne, currentpoint est null, donc if (anchor.x>40 && anchor.x<60 && (currentpoint.x>340 && currentpoint.x<360)){ va provoquer une NullPointerException lors de l'accès à x et y de currentpoint. Tu dois encadrer ce test, ainsi que les trois autres, ainsi que le tracer de la ligne anchor/currentpoint seulement et seulement si anchor et currentpoint ne sont pas nulls. A noter, le problème sur tooMany lorsqu'on atteint le maximum. Accessoirement, une remise à null d'anchor en même temps que currentpoint serait logique.
    3. Lors du tracé d'une ligne, elle s'affiche bien, sauf pour la première ligne. Parce que le tracé de la ligne en cours est fait dans la boucle de dessin des lignes. Le tracé de ligne en cours doit être à part du tracé des lignes ajoutées au tableau, sinon, forcément, quand il n'y a aucune ligne dans le tableau, on n'entre pas dans la boucle, donc pas de tracé de la ligne en cours.
      Une indentation correcte permet de mieux voir ce genre de problème. Et le respect des conventions d'écriture Java ne ferait pas de mal par ailleurs.


    Par ailleurs, il y a un risque nul d'avoir à la fois anchor.x compris entre 40 et 60, 190 et 200, 340 et 360. Donc initialiser y à 55, lui ajouter 60, pour tracer une ligne ensuite n'a aucun intérêt. D'autant plus qu'il y a des else if. Tu peux directement mettre la constante 115 à la place des y dans les g.drawLine(). A ce propos, il y a un petit problème d'inconsistence, mais peut-être est-ce voulu : si l'un des tests sur anchor.x et currentpoint.x, tu changes la couleur définitivement en bleu pour les lignes dessinées après, celles dessinées avant étant noires : tu vas donc avoir au gré du déplacement de currentpoint, un passage du noir au bleu et inversement.

    Enfin, il est toujours préférable d'appeler super.paint(g), lorqu'on redéfini paint(), pour laisser l'implémentation standard s'occuper du rendu du fond du composant.

    A part ça, à quoi sert le new jliste() ?
    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.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    ingénieur télécom
    Inscrit en
    Février 2017
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ingénieur télécom
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2017
    Messages : 54
    Points : 27
    Points
    27
    Par défaut
    Bonjour Joel ,
    en fait , je veux que mon application me permettre de dessiner des scénarios , alors en fonction de la ligne dessiner avec la souris je peux comprendre la ligne qu'il veux dessiner l'utilisateur donc après la release de la souris on affiche une liste (c'est le rôle de "new jliste(); ") après qu'il sélectionne un élément, la ligne qu'il a dessiné avec la souris doit être effacer et en fonctions des coordonnes on dessine une autre fléché bien aligné .en augmentant la valeur de y a chaque fois les lignes seront parallèles et mieux organisés (c'est une autre problème :le y n'augmente pas ) ,
    toutes les flèches dessinés par l'application doivent étre conservés mais dans mon code quand je release la souris tout s'efface

  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 : 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
    Si je comprends bien, tu voudrais que l'utilisateur puisse dessiner des flêches, toujours horizontales, c'est bien ça ? Et en quelque sorte aimantées par rapport aux règles (l'utilisateur dessiner sans précision, mais la flêche apparait à un endroit déterminé) que tu dessines au début de la méthode.
    Déjà, tu devrais, plutôt que de faire des tests en dur, avoir une liste de règles, ce qui te permettra de les dessiner, et de déterminer les coordonnées de la flêche. Les coordonnées de la flêche ne sont donc pas les coordonnées de la souris lors du tracé, mais le résultat d'une fonction : on cherche la règle qui correspond aux coordonnées de la souris, puis on les passe à une méthode de la règle qui retourne les bonnes coordoonées.
    Pour les y, ton problème est que à chaque fois que le composant est déssiné, y est réinitialisé. Il faut que y soit un attribut de la classe pour qu'il soit conservé entre chaque redessin.
    Il ne faut par ailleurs ne pas recalculer les coordonnées à chaque fois qu'on redessine, mais uniquement lorsqu'une ligne est créée : il est donc préférable ne ne pas faire ça dans la méthode paint().

    Pour la raison qui fait que tes lignes s'effacent au relâchement de la souris, j'ai déjà expliqué pourquoi.

    Voilà un exemple du genre de chose que tu veux faire. Ce n'est pas exactement ce que tu veux faire, mais il y a tout les mécanismes nécessaires pour le tracer en tout cas.

    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
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    public class Exemple extends JPanel {
     
    	private static final int MARGETOP = 50;
    	private static final int WIDTH = 100;
    	private static final int H = 60;
    	private static final int HEIGHT = 3 * H;
    	private static final int MARGIN = 5;
    	private static final int ARROW = 5;
     
    	private Rule[] rules = new Rule[5];
    	private List<Arrow> arrows = new ArrayList<>();
     
    	private int y = MARGETOP + H / 2;
    	private Arrow currentArrow;
     
    	public Exemple() {
     
    		String[] ruleNames = { "UE", "NodeB", "SRNC", "DRNC", "CN" };
    		int x = 0;
    		for (int i = 0; i < rules.length; i++, x += WIDTH) {
    			rules[i] = new Rule(ruleNames[i], x, WIDTH);
    		}
     
    		setPreferredSize(new Dimension(x, MARGETOP + Rule.N * HEIGHT));
     
    		MouseAdapter mouseAdapter = new MouseAdapter() {
     
    			@Override
    			public void mousePressed(MouseEvent e) {
    				currentArrow = createArrow(e.getPoint());
    				repaint();
    			}
     
    			@Override
    			public void mouseDragged(MouseEvent e) {
    				updateArrow(e.getPoint());
    				repaint();
    			}
     
    			@Override
    			public void mouseReleased(MouseEvent e) {
    				updateArrow(e.getPoint());
    				saveArrow();
    			}
     
    		};
    		addMouseListener(mouseAdapter);
    		addMouseMotionListener(mouseAdapter);
     
    	}
     
    	protected void saveArrow() {
    		if (currentArrow != null && currentArrow.isValid()) {
    			arrows.add(currentArrow);
    			y += H;
    		}
    		currentArrow = null;
    	}
     
    	private Arrow createArrow(Point point) {
    		for (Rule rule : rules) {
    			if (rule.contains(point)) {
    				return rule.createArrow(point, y);
    			}
    		}
    		return null;
    	}
     
    	private void updateArrow(Point point) {
    		if (currentArrow != null) {
    			for (Rule rule : rules) {
    				if (rule.contains(point)) {
    					rule.updateArrow(currentArrow, point);
    				}
    			}
    		}
    	}
     
    	@Override
    	public void paint(Graphics g) {
    		super.paint(g);
    		for (Rule rule : rules) {
    			rule.draw(g);
    		}
     
    		g.setColor(Color.BLUE);
    		for (Arrow arrow : arrows) {
    			arrow.draw(g);
    		}
     
    		g.setColor(Color.RED);
    		if (currentArrow != null) {
    			currentArrow.draw(g);
    		}
    	}
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame();
     
    		frame.add(new Exemple());
     
    		frame.pack();
    		frame.setLocationRelativeTo(null);
     
    		frame.setVisible(true);
     
    	}
     
    	public static class Arrow {
     
    		private int x;
    		private int xend;
    		private int y;
     
    		public Arrow(int x, int y) {
    			this.x = x;
    			this.xend = x;
    			this.y = y;
    		}
     
    		public void draw(Graphics g) {
    			if (isValid()) {
    				Graphics2D g2d = (Graphics2D) g;
    				g2d.drawLine(x, y, xend, y);
    				g2d.drawLine(xend, y, xend - ARROW, y - ARROW);
    				g2d.drawLine(xend, y, xend - ARROW, y + ARROW);
    			}
    		}
     
    		public boolean isValid() {
    			return xend != x;
    		}
     
    		public void setEnd(int end) {
    			if (end <= x) {
    				xend = x;
    			} else if (end - x >= 2 * WIDTH) {
    				xend = x + 2 * WIDTH;
    			} else if (end - x <= WIDTH) {
    				xend = x + WIDTH;
    			}
    		}
     
    	}
     
    	public static class Rule {
     
    		public static final int N = 4;
     
    		private final String name;
    		private final int start;
    		private final int width;
    		private Rectangle2D textBounds;
     
    		private Rectangle2D rectangle;
     
    		public Rule(String name, int start, int width) {
    			this.name = name;
    			this.start = start;
    			this.width = width;
    			this.rectangle = new Rectangle2D.Double(start, MARGETOP, start + width, MARGETOP + N * HEIGHT);
    		}
     
    		public Arrow createArrow(Point point, int y) {
    			return new Arrow(start + width / 2, y);
    		}
     
    		public void updateArrow(Arrow currentArrow, Point point) {
    			currentArrow.setEnd(start + width / 2);
    		}
     
    		public boolean contains(Point point) {
    			return rectangle.contains(point);
    		}
     
    		public void draw(Graphics g) {
     
    			g.setColor(Color.BLACK);
     
    			int x = start + width / 2;
    			int y = MARGETOP;
     
    			if (textBounds == null) {
    				Rectangle2D stringBounds = g.getFontMetrics().getStringBounds("MMMM", g);
    				textBounds = new Rectangle2D.Double(x - stringBounds.getWidth() / 2 - MARGIN,
    						y - stringBounds.getHeight() - MARGIN, MARGIN * 2 + stringBounds.getWidth(),
    						MARGIN * 2 + stringBounds.getHeight());
    			}
    			Graphics2D g2d = ((Graphics2D) g);
    			g2d.draw(textBounds);
    			Point2D.Float p = getStringLocation(g2d, textBounds, name, SwingConstants.CENTER, SwingConstants.CENTER);
    			g2d.drawString(name, (float) p.getX(), (float) p.getY());
     
    			for (int i = 0; i < N; i++, y += HEIGHT) {
    				g2d.drawLine(x, y + MARGIN, x, y + HEIGHT - MARGIN);
    			}
     
    		}
     
    	}
     
    	/**
             * méthode qui permet de placer un texte relativement à un rectangle : elle
             * calcule la position à utiliser avec la méthode Graphics.drawString()
             * 
             * @param g2d
             *            contexte graphique
             * @param bounds
             *            bounds du rectangle
             * @param string
             *            le texte
             * @param halign
             *            le type d'alignement horizontal parmi SwingContants.LEFT,
             *            SwingConstants.CENTER ou SwingConstants.RIGHT
             * @param valign
             *            le type d'alignement vertical parmi SwingContants.TOP,
             *            SwingConstants.CENTER ou SwingConstants.BOTTOM
             * @return
             */
    	public static Point2D.Float getStringLocation(Graphics2D g2d, Rectangle2D bounds, String string, int halign,
    			int valign) {
     
    		final FontMetrics fontMetrics = g2d.getFontMetrics();
    		final Rectangle2D textBounds = fontMetrics.getStringBounds(string, g2d);
    		final double textWidth = textBounds.getWidth();
     
    		double x, y;
     
    		switch (halign) {
    		case SwingConstants.LEFT:
    			x = bounds.getX();
    			break;
    		case SwingConstants.RIGHT:
    			x = bounds.getX() + bounds.getWidth() - textWidth;
    			break;
    		case SwingConstants.CENTER:
    		default:
    			x = bounds.getX() + (bounds.getWidth() - textWidth) / 2;
    			break;
    		}
    		switch (valign) {
    		case SwingConstants.TOP:
    			y = bounds.getY() + fontMetrics.getAscent() - fontMetrics.getDescent();
    			break;
    		case SwingConstants.BOTTOM:
    			y = bounds.getY() + bounds.getHeight() - fontMetrics.getDescent();
    			break;
    		case SwingConstants.CENTER:
    		default:
    			y = bounds.getY() + bounds.getHeight() / 2 - ((fontMetrics.getAscent() + fontMetrics.getDescent()) / 2)
    					+ fontMetrics.getAscent();
    			break;
    		}
     
    		return new Point2D.Float((float) x, (float) y);
    	}
     
    }


    Pour la sélection, ce n'est pas très clair. En tout cas, le new jliste() ne fait rien, ne dessine rien, n'échange rien avec la classe (heureusement, parce que que ça ne devrait surtout pas être dans paint).
    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.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    ingénieur télécom
    Inscrit en
    Février 2017
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ingénieur télécom
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2017
    Messages : 54
    Points : 27
    Points
    27
    Par défaut
    Bonjour Joel ;
    merci pour le code que tu as envoyé , je n'arrive pas a afficher la liste aprés que le fleche se dessine ,je veux qu'aprés la release de la souris la liste s'affiche et aprés la séléction de l'élément adéquat on peut refaire dessiner un autre fleche

  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 : 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
    Plutôt qu'une liste, je te conseille d'afficher un menu popup, ce sera plus simple à gérer (une liste, une JList par exemple, doit être layoutée, ou alors il faudrait utiliser un JLayer, ou un OverlayLayout..., bref, le JPopup c'est plus simple).

    Exemple ci-après. Voir la méthode saveArrow() que j'ai modifiée : je fais juste une option pour choisir le sens, mais on peut faire tout ce qu'on veut (changer la forme de la flêche, la couleur, afficher autre chose qu'une flêche, peu importe).

    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
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    public class Exemple extends JPanel {
     
    	private static final int MARGETOP = 50;
    	private static final int WIDTH = 100;
    	private static final int H = 60;
    	private static final int HEIGHT = 3 * H;
    	private static final int MARGIN = 5;
    	private static final int ARROW = 5;
     
    	private Rule[] rules = new Rule[5];
    	private List<Arrow> arrows = new ArrayList<>();
     
    	private int y = MARGETOP + H / 2;
    	private Arrow currentArrow;
     
    	public Exemple() {
     
    		String[] ruleNames = { "UE", "NodeB", "SRNC", "DRNC", "CN" };
    		int x = 0;
    		for (int i = 0; i < rules.length; i++, x += WIDTH) {
    			rules[i] = new Rule(ruleNames[i], x, WIDTH);
    		}
     
    		setPreferredSize(new Dimension(x, MARGETOP + Rule.N * HEIGHT));
     
    		MouseAdapter mouseAdapter = new MouseAdapter() {
     
    			@Override
    			public void mousePressed(MouseEvent e) {
    				currentArrow = createArrow(e.getPoint());
    				repaint();
    			}
     
    			@Override
    			public void mouseDragged(MouseEvent e) {
    				updateArrow(e.getPoint());
    				repaint();
    			}
     
    			@Override
    			public void mouseReleased(MouseEvent e) {
    				updateArrow(e.getPoint());
    				saveArrow(e.getPoint());
    				repaint();
    			}
     
    		};
    		addMouseListener(mouseAdapter);
    		addMouseMotionListener(mouseAdapter);
     
    	}
     
    	private void saveArrow(Point mouse) { 
    		if (currentArrow != null && currentArrow.isValid()) {
    			JPopupMenu popup = new JPopupMenu();
    			ActionListener menuListener = new ActionListener() {
    			      public void actionPerformed(ActionEvent event) {
    			        switch (event.getActionCommand()) {
    					case "LEFT":
    						currentArrow.setLeft(true);
    						break;
    					case "RIGHT":
    						currentArrow.setLeft(false);
    						break;
    					default:
    						break;
    					}
    					arrows.add(currentArrow);
    					y += H;
    					currentArrow=null;
    					repaint();
    			      }
    			    };
    			JMenuItem item;
    		    popup.add(item = new JMenuItem("Droite"));
    		    item.addActionListener(menuListener);
    		    item.setActionCommand("RIGHT");
    		    popup.add(item = new JMenuItem("Gauche"));
    		    item.addActionListener(menuListener);
    		    item.setActionCommand("LEFT"); 
    		    popup.show(this, mouse.x, mouse.y);
    		}
    		else {
    			currentArrow=null;
    		}
    	}
     
    	private Arrow createArrow(Point point) {
    		for (Rule rule : rules) {
    			if (rule.contains(point)) {
    				return rule.createArrow(point, y);
    			}
    		}
    		return null;
    	}
     
    	private void updateArrow(Point point) {
    		if (currentArrow != null) {
    			for (Rule rule : rules) {
    				if (rule.contains(point)) {
    					rule.updateArrow(currentArrow, point);
    					break;
    				}
    			}
    		}
    	}
     
    	@Override
    	public void paint(Graphics g) {
    		super.paint(g);
    		for (Rule rule : rules) {
    			rule.draw(g);
    		}
     
    		g.setColor(Color.BLUE);
    		for (Arrow arrow : arrows) {
    			arrow.draw(g);
    		}
     
    		g.setColor(Color.RED);
    		if (currentArrow != null) {
    			currentArrow.draw(g);
    		}
    	}
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame();
     
    		frame.add(new Exemple());
     
    		frame.pack();
    		frame.setLocationRelativeTo(null);
     
    		frame.setVisible(true);
     
    	}
     
    	public static class Arrow {
     
    		private int x;
    		private int xend;
    		private int y;
    		private boolean left;
     
    		public Arrow(int x, int y) {
    			this.x = x;
    			this.xend = x;
    			this.y = y;
    		}
     
    		public void setLeft(boolean left) {
    			this.left=left;
    		}
     
    		public void draw(Graphics g) {
    			if (isValid()) {
    				Graphics2D g2d = (Graphics2D) g;
    				g2d.drawLine(x, y, xend, y);
    				if ( left ) {
    					g2d.drawLine(x, y, x + ARROW, y - ARROW);
    					g2d.drawLine(x, y, x + ARROW, y + ARROW);
    				}
    				else {
    					g2d.drawLine(xend, y, xend - ARROW, y - ARROW);
    					g2d.drawLine(xend, y, xend - ARROW, y + ARROW);
    				}
    			}
    		}
     
    		public boolean isValid() { 
    			return xend != x;
    		}
     
    		public void setEnd(int end) {
    			if (end <= x+MARGIN) {
    				xend = x;
    			} else if (end - x >= 2 * WIDTH) {
    				xend = x + 2 * WIDTH;
    			} else if (end - x <= WIDTH) {
    				xend = x + WIDTH;
    			}
    		}
     
    	}
     
    	public static class Rule {
     
    		public static final int N = 4;
     
    		private final String name;
    		private final int start;
    		private final int width;
    		private Rectangle2D textBounds;
     
    		private Rectangle2D rectangle;
     
    		public Rule(String name, int start, int width) {
    			this.name = name;
    			this.start = start;
    			this.width = width;
    			this.rectangle = new Rectangle2D.Double(start, MARGETOP, start + width - 1, MARGETOP + N * HEIGHT);
    		}
     
    		public Arrow createArrow(Point point, int y) {
    			return new Arrow(start + width / 2, y);
    		}
     
    		public void updateArrow(Arrow currentArrow, Point point) {
    			currentArrow.setEnd(start + width / 2);
    		}
     
    		public boolean contains(Point point) {
    			return rectangle.contains(point);
    		}
     
    		public void draw(Graphics g) {
     
    			g.setColor(Color.BLACK);
     
    			int x = start + width / 2;
    			int y = MARGETOP;
     
    			if (textBounds == null) {
    				Rectangle2D stringBounds = g.getFontMetrics().getStringBounds("MMMM", g);
    				textBounds = new Rectangle2D.Double(x - stringBounds.getWidth() / 2 - MARGIN,
    						y - stringBounds.getHeight() - MARGIN, MARGIN * 2 + stringBounds.getWidth(),
    						MARGIN * 2 + stringBounds.getHeight());
    			}
    			Graphics2D g2d = ((Graphics2D) g);
    			g2d.draw(textBounds);
    			Point2D.Float p = getStringLocation(g2d, textBounds, name, SwingConstants.CENTER, SwingConstants.CENTER);
    			g2d.drawString(name, (float) p.getX(), (float) p.getY());
     
    			for (int i = 0; i < N; i++, y += HEIGHT) {
    				g2d.drawLine(x, y + MARGIN, x, y + HEIGHT - MARGIN);
    			}
     
    		}
     
    	}
     
    	/**
             * méthode qui permet de placer un texte relativement à un rectangle : elle
             * calcule la position à utiliser avec la méthode Graphics.drawString()
             * 
             * @param g2d
             *            contexte graphique
             * @param bounds
             *            bounds du rectangle
             * @param string
             *            le texte
             * @param halign
             *            le type d'alignement horizontal parmi SwingContants.LEFT,
             *            SwingConstants.CENTER ou SwingConstants.RIGHT
             * @param valign
             *            le type d'alignement vertical parmi SwingContants.TOP,
             *            SwingConstants.CENTER ou SwingConstants.BOTTOM
             * @return
             */
    	public static Point2D.Float getStringLocation(Graphics2D g2d, Rectangle2D bounds, String string, int halign,
    			int valign) {
     
    		final FontMetrics fontMetrics = g2d.getFontMetrics();
    		final Rectangle2D textBounds = fontMetrics.getStringBounds(string, g2d);
    		final double textWidth = textBounds.getWidth();
     
    		double x, y;
     
    		switch (halign) {
    		case SwingConstants.LEFT:
    			x = bounds.getX();
    			break;
    		case SwingConstants.RIGHT:
    			x = bounds.getX() + bounds.getWidth() - textWidth;
    			break;
    		case SwingConstants.CENTER:
    		default:
    			x = bounds.getX() + (bounds.getWidth() - textWidth) / 2;
    			break;
    		}
    		switch (valign) {
    		case SwingConstants.TOP:
    			y = bounds.getY() + fontMetrics.getAscent() - fontMetrics.getDescent();
    			break;
    		case SwingConstants.BOTTOM:
    			y = bounds.getY() + bounds.getHeight() - fontMetrics.getDescent();
    			break;
    		case SwingConstants.CENTER:
    		default:
    			y = bounds.getY() + bounds.getHeight() / 2 - ((fontMetrics.getAscent() + fontMetrics.getDescent()) / 2)
    					+ fontMetrics.getAscent();
    			break;
    		}
     
    		return new Point2D.Float((float) x, (float) y);
    	}
     
    }
    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.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    ingénieur télécom
    Inscrit en
    Février 2017
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ingénieur télécom
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2017
    Messages : 54
    Points : 27
    Points
    27
    Par défaut
    Merci Joel pour ton code , c'est une bonne idée d'ajouter le sens du flèche mais en fait en peut changer le sens du flèche quant il dessine même par exemple si l’abscisse ou il relâche la souris est plus grand au abscisse ou il clique la souris le sens est droit dans le cas contraire est gauche .
    Maintenant pour la liste que je vient d'afficher doit contenir 477 élément est ça c trop donc je pense à ajouter une petite barre de recherche ( Jlabel ) pour faciliter la recherche des éléments , je ne sais pas est-ce qu'on peut faire ça dans un JPopup ou non !
    dans le code que vous avez envoyé comment je peux ajouter une fléche entre le DRNC et le CN !

  9. #9
    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
    Citation Envoyé par RabehBoubakri Voir le message
    Merci Joel pour ton code , c'est une bonne idée d'ajouter le sens du flèche mais en fait en peut changer le sens du flèche quant il dessine même par exemple si l’abscisse ou il relâche la souris est plus grand au abscisse ou il clique la souris le sens est droit dans le cas contraire est gauche .
    C'était juste un exemple, rapide à faire. En plus, dans mon code, j'ai volontairement empêcher de pouvoir faire des flêches de la droite vers la gauche par tracé. Mais tu adaptes comme tu veux.

    Citation Envoyé par RabehBoubakri Voir le message
    Maintenant pour la liste que je vient d'afficher doit contenir 477 élément est ça c trop donc je pense à ajouter une petite barre de recherche ( Jlabel ) pour faciliter la recherche des éléments , je ne sais pas est-ce qu'on peut faire ça dans un JPopup ou non !
    Mmm, c'est sûr que ça fait beaucoup pour un menu. Soit tu t'arranges pour faire des regroupements (on peut faire des sous-menus), soit tu fais carrément un dialogue modale, avec la classe JDialog (On pourrait utilsier JOptionPane, mais même si ça fait un tout petit peu de travail en plus, la dynamique est plus simple à gérer). Tu pourras y mettre une combo avec autocompletion, ou recherche, des checkbox de filtre, etc, tout ce que tu veux.


    Citation Envoyé par RabehBoubakri Voir le message
    dans le code que vous avez envoyé comment je peux ajouter une fléche entre le DRNC et le CN !
    Il y a un petit bug, dans la largeur du rectangle : il faut new Rectangle2D.Double(start, MARGETOP, width - 1, MARGETOP + N * HEIGHT);D'ailleurs, on peut faire évoluer pour avoir une réactivité plus intuitive, par exemple avec deux rectangles différents pour le start et le end (dans mousePressed on teste "rectangleStart.contains" et dans le mouseRelease et mouseDrag le "rectangleEnd.contains")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.rectangleStart = new Rectangle2D.Double(start, MARGETOP, width - 1, MARGETOP + N * HEIGHT);
    this.rectangleEnd = new Rectangle2D.Double(start, MARGETOP, width + width - 1, MARGETOP + N * HEIGHT);
    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.

Discussions similaires

  1. Récupérer le n° ligne en erreur dans un vbs
    Par fleurparis dans le forum VBScript
    Réponses: 0
    Dernier message: 22/08/2010, 09h47
  2. Erreur dans un CArray d'une classe créée (error C2248)
    Par cricri-larson dans le forum MFC
    Réponses: 6
    Dernier message: 16/07/2009, 11h11
  3. Parcourir les elements d'une ligne crée dynamiquement dans un FORM
    Par redabadache3 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/12/2008, 14h30
  4. [H2Database] Obtenir la dernière ligne créée dans une table
    Par jmnicolas dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 26/06/2008, 10h28
  5. erreur dans l'insertion d'une ligne dans la table
    Par Eternel_F dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/06/2008, 09h19

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