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 :

sélection d'un item (focus)


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    853
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 853
    Par défaut sélection d'un item (focus)
    salut

    j'ai fait un mini programme pour dessiner des formes, il fonctionne bien, mais je chercher à ajouter quelques fonctionnalités

    mes formes dessiné ont tous une méthode

    draw(Graphics g)

    je cherche à ce que les formes dessiné ai des petits carré autour afin de savoir si elle est sélectionné au non

    je sais pas comment m'y prendre pour faire cette tâche, je pensais envoyé un paramètre pour lui s'il est sélectionné ou non

    je serais obligé de forcé un redessinage de la pièce

    quel serait une bonne pratique pour ce cas là?

    merci

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    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
    List<Shape> shapes = ...
    Shape selectedShape = null;
    Rectangle2D.Float currentBounds = new Rectangle2D.Float();
    int margin = 20;
     
    /**
    * {@inheritDoc}
    */
    @Override
    protected void paintComponent(Graphics g) {
      Dimension size = getSize();
      Insets insets = getInsets();
      int width = size.width - (insets.left + insets.right);
      int height = size.height - (insets.top + insets.bottom);
      Graphics2D g2d = g.create(insets.left, insets.top, width, height);
      try {
        Shape clip = g2d.getClip();
        for (Shape s : shapes) { 
           Rectange2D sb = s.getBounds2D();
           currentBounds.x = (float) (sb.getX() - margin);
           currentBounds.y = (float) (sb.getY() - margin);
           currentBounds.width = (float) (sb.getWidth() + 2 * margin);
           currentBounds.height= (float) (sb.getHeight() + 2 * margin);
           // Pas la peine de dessiner si ce n'est pas dans la zone a afficher.
           if (clip.intersects(currentBounds ) || clip.contains(currentBounds ) || bounds.contains(clip)) {
             g2d.setPaint(...);
             g2d.fill(s);
             g2d.setStroke(...);
             g2d.setPaint(...);
             g2d.draw(s);
           }
        } 
        // On dessine les ancres par dessus.
        if (selectedShape != null) {
          Rectange2D sb = selectedShape .getBounds2D();
          currentBounds .x = (float) (sb.getX() - margin);
          currentBounds .y = (float) (sb.getY() - margin);
          currentBounds .width = (float) (sb.getWidth() + 2 * margin);
          currentBounds .height= (float) (sb.getHeight() + 2 * margin);
           // Pas la peine de dessiner si ce n'est pas dans la zone a afficher.
          if (clip.intersects(currentBounds ) || clip.contains(currentBounds ) || bounds.contains(clip)) {
            // Dessiner les ancres en utilisant sb pour les positionner.
            [...]           
          }
        }
      }
      finally {
        g2d.dispose();
      }
    }
     
    /**
    * {@inheritDoc}
    */
    @Override
    public void mouseClicked(MouveEvent e) {
      Insets insets = getInsets();
      float x = e.getX() - insets.left;
      float y = e.getY() - insets.top;
      // Reafficher a la position de l'ancienne selection.
      if (selectedShape != null) {
         Rectange2D sb = selectedShape.getBounds2D();
         currentBounds.x = (float) (sb.getX() - margin);
         currentBounds.y = (float) (sb.getY() - margin);
         currentBounds.width = (float) (sb.getWidth() + 2 * margin);
         currentBounds.height= (float) (sb.getHeight() + 2 * margin);
         repaint((int) (currentBounds.x + insets.left),  (int) (currentBounds.y + insets.top), (int)currentBounds.width, (int) currentBounds.height);
      }
      selectedShape = null;
      // Partir de la fin de la liste vers le debut pour recuperer les formes situees au dessus en premier.
      for (ListIterator<Shape> it = shapes.listIterator(list.size()-1) ; it.hasPrevious() ; ) {
        Shape s = it.previous();
        if (s.contains(x, y)) {
          selectedShape = s;
          break;
        }
      }
      // Reafficher a la position de la nouvelle selection.
      if (selectedShape != null) {
         Rectange2D sb = selectedShape.getBounds2D();
         currentBounds.x = (float) (sb.getX() - margin);
         currentBounds.y = (float) (sb.getY() - margin);
         currentBounds.width = (float) (sb.getWidth() + 2 * margin);
         currentBounds.height= (float) (sb.getHeight() + 2 * margin);
         repaint((int) (currentBounds.x + insets.left),  (int) (currentBounds.y + insets.top), (int)currentBounds.width, (int) currentBounds.height);
      }
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    853
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 853
    Par défaut
    ça semble pas vraiment applicable pour mon cas...

    j'ai une classe qui extends mouseAdapter
    dans cette classe, j'ai un jpanel (nommé canvas) sur lequel je dessine des formes

    dans mon mouseDragged, je fais un repaint à partir du canvas

    dans mon mouseClick je fais rien encore... j'arrive à savoir aisément si le composant a le focus ou non

    c'est sur la façon d'appeler le draw que je me questionne faudrait que je modifie le draw... ou bien créer une nouvelle méthode que j'appèlerais dans mon mouseclick....

    ça fait plus crade... il me semble

    est-ce que si mes formes hériterais de component ça faciliterais les choses?

    des commentaires?

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Je ne vois pas trop en quoi ca ne sera pas adaptable a ton code.

    C'est possible de faire un JComponent par forme c'est juste inutilement lourd. Mais ca reste faisable.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    853
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 853
    Par défaut
    si je comprend bien ton code, tu as par exemple un jpanel qui dedans a la méthode paintComponent et mouseClicked, les formes sont directement dessiné et tu peux savoir directement si c'est la forme est sélectionné ou non et dessiné en conséquence

    étant donné que mes formes ont leur propre méthode draw, je suis supposé faire comment pour lui dire qu'elle a le focus?

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    En leur mettant un membre booleen focus et en t'arrangeant pour qu'on ne puisse avoir qu'une seule et unique forme ayant le focus à la fois. Il faut ensuite rajouter le rendu du focus dans le code dessin de la forme ou déléger à une autre classe (par exemple si le rendu est tout le temps de type boite rectangulaire avec 6 carrés de sélection ça ne sert à rien de le dupliquer un peu partout, il vaudra mieux déléger à une autre classe).

    Mais que sont tes formes ? Des listes de points ? Des objes étendant Shape ? Des objets étendant JComponent ?

    Dans les deux premiers cas tu n'échapperas pas à une gestion de la forme active similaire à ce que j'ai fait.
    Dans le second tu devras te créer un gestionnaire de focus dans lequel tu devras enregister toutes les formes (penser à désenregistrer lorsqu'on en supprime une) et qui écoutera les évenement de gain/perte de focus pour s'arranger pour qu'il n'y ai jamais qu'au plus une forme ayant le focus.

    Et il y a bien un composant racine qui se charge de les afficher ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Sélection d'un item d'un listbox via une valeur
    Par Filipegomes dans le forum C#
    Réponses: 10
    Dernier message: 31/10/2007, 13h50
  2. Sélection d'un Item dans un ComboBox
    Par stephane.julien dans le forum C#
    Réponses: 5
    Dernier message: 25/10/2007, 14h33
  3. Problème de sélection d'un item dans une CListCtrl
    Par PetitPapaNoël dans le forum MFC
    Réponses: 9
    Dernier message: 01/08/2007, 14h51
  4. Réponses: 4
    Dernier message: 19/06/2006, 10h09
  5. sélection d'un item dans syslistview32
    Par devmat dans le forum MFC
    Réponses: 2
    Dernier message: 06/10/2005, 14h19

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