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 :

[Débutant]Erreur compilation !


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club Avatar de gandalf_le_blanc
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 161
    Points : 47
    Points
    47
    Par défaut [Débutant]Erreur compilation !
    Salut,

    j'ai créé une applet et je voudrais mettre des images sur le fond.
    J'ai utilisé ce code là :
    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
     
    import javax.swing.ImageIcon;
    import javax.swing.JComponent;
    import java.awt.*;
    import java.awt.image.*;
     
    public class Image extends JComponent
    {
      private int mode;
      private TexturePaint texture; 
      private BufferedImage bufferedImage; 
     
      public static final int CENTRE = 0;
      public static final int TEXTURE = 1;
     
      public Image(String fileName, int mode )
      {	
        this.mode = mode;
        this.bufferedImage = this.toBufferedImage(Toolkit.getDefaultToolkit().getImage(fileName));
        this.texture = new TexturePaint(bufferedImage,new Rectangle(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight())); 
      } 
      public void paintComponent(Graphics g)
      {	
        switch( mode )
        {	
            case TEXTURE :
          Graphics2D g2d = (Graphics2D)g; 
          g2d.setPaint(texture);
          g2d.fillRect(0, 0, getWidth(), getHeight() );
          break;
        case CENTRE :
          g.setColor(this.getBackground());
          g.fillRect(0,0,getWidth(), getHeight() );
          g.drawImage(bufferedImage,(getWidth()-bufferedImage.getWidth())/2,(getHeight()-bufferedImage.getHeight())/2,null);
          break;
        default :
          super.paintComponents(g);
        }
      }
     
     
      private BufferedImage toBufferedImage(Image image)
      {	image = new ImageIcon(image).getImage(); 
     
        BufferedImage bufferedImage = new BufferedImage( image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB); 
        Graphics g = bufferedImage.createGraphics(); 
     
        g.setColor(Color.white); 
        g.fillRect(0, 0, image.getWidth(null), 
                   image.getHeight(null)); 
        g.drawImage(image, 0, 0, null); 
        g.dispose(); 
        return bufferedImage; 
      }
     
    }
    Sauf que j'ai une erreur à cette ligne là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.bufferedImage = this.toBufferedImage(Toolkit.getDefaultToolkit().getImage(fileName));
    L'erreur est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    toBufferedImage(projet_applet.Image)dans projet_applet.Image ne peut pas être appliqué à (java.awt.Image) à la ligne 20
    L'autre erreur se trouve ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    image = new ImageIcon(image).getImage();
    Code assez simple pourtant, il me met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    impossible de résoudre le symbole  : contructeur ImageIcon
    Qu'en pensez vous ?

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Dans ton code tu fais une confusion avec la classe java.awt.Image du JDK et ta classe Image.
    Du coups le compilateur donne la "priorité" à ta classe lorsque tu indique simplement Image.

    Lorsque tu utilises une java.awt.Image spécifie le nom complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private BufferedImage toBufferedImage(java.awt.Image image)
    ...
    Idem pour la deuxième erreur... Il ne trouve pas de constructeur pour l'ImageIcon avec ton objet Image en paramètre...

    Plus simplement, change le nom de ta classe par exemple en JImage pour éviter ces conflits de noms...

    a++

  3. #3
    Membre du Club Avatar de gandalf_le_blanc
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 161
    Points : 47
    Points
    47
    Par défaut
    Ah oui ,c vrai, j'avais pas vu que j'avis écrit la classe comme celà .

    Merci !!!

  4. #4
    Membre du Club Avatar de gandalf_le_blanc
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 161
    Points : 47
    Points
    47
    Par défaut
    Bon, j'ai voulu insérer une image dans mon applet avec ce code là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     p1.add(new ImageScreen("C:\\Documents and Settings\\Administrateur\\Bureau\\jbproject\\Icones\\let1.jpg", ImageScreen.CENTRE));
    p1 etant un JPanel et ImageScreen etant la classe que j'ai parlé au dessus (j'ai chang le nom pour passer de Image à ImageScreen)

    Mais ca n'affiche rien.

    Est ce que je le fais de la bonne façon ?

  5. #5
    Membre du Club Avatar de gandalf_le_blanc
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 161
    Points : 47
    Points
    47
    Par défaut

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 46
    Points : 56
    Points
    56
    Par défaut
    As-tu essayé en mettant ton jpg dans un répertoire sans nom long ni espaces (en c:\temp par exemple) ?

  7. #7
    Membre du Club Avatar de gandalf_le_blanc
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 161
    Points : 47
    Points
    47
    Par défaut
    Non je n'ai pas essayé et ca ne m'arrange pas de faire celà.

    Pkoi ca changerais quelquechose

  8. #8
    Membre du Club Avatar de gandalf_le_blanc
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 161
    Points : 47
    Points
    47
    Par défaut
    D'après moi, la question est de savoir si j'ai le droit d'ajouter une image sur un JPanel ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 46
    Points : 56
    Points
    56
    Par défaut
    Ahhh j'avions pas vu

    Il ne faut pas ajouter (add) une image au JPanel mais la peindre (paint)

    surcharge ta méthode paint(Graphics g) avec un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    super.paint(g) 
    g.drawImage(monImage)

  10. #10
    Membre du Club Avatar de gandalf_le_blanc
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 161
    Points : 47
    Points
    47
    Par défaut
    J'ai trouvé un bout de code qui utilisait le code que j'ai mis dans mon premier message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.setContentPane(new ImageScreen("butterfly.jpg",mode));
    this etant une JFrame.

    Comment je peux faire pour ajouter cette image à une JPAnel si c possible ???

    p1.paint ne fonctionne pas car il faut mettre un graphic en paramètre et ce n'est pas le cas de ImageScreen
    (j'ai remplacé Image par ImageScreen dans le code de mon premier post) !!!

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 46
    Points : 56
    Points
    56
    Par défaut
    Ce n'est pas à toi d'invoquer la méthode paint().
    C'est Swing qui fait ca tout seul.
    Quant au Graphic c'est the Graphics context in which to paint.
    En clair c'est Swing qui gère là aussi.

    Si tu veux une image dans ton JPanel, tu surcharges la méthode MonJPanel.paint().

    Maintenant avec ton ImageScreen qui est elle même un JComponent, tu dois pouvoir l'ajouter à ton panel.
    Mais là encore il faut surcharger la méthode ImageScreen.paint() pour que ton JComponent soit peint avec ton image.

  12. #12
    Membre du Club Avatar de gandalf_le_blanc
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 161
    Points : 47
    Points
    47
    Par défaut
    J'ai du mal à comprendre le terme surcharger !!

    Mon objet ImageScreen est bien un JComponent donc d'après toi, il me suffit de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonJPanel.paint(new ImageScreen("chemin","mode"))
    C ca ?

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 46
    Points : 56
    Points
    56
    Par défaut
    Ok.
    Quand tu étends (extend) une classe (ici JComponent) tu hérites des méthodes de la classe d'origine.
    Mais tu peux les surcharger, c'est à dire les ré-écrire pour qu'elles fassent ce que veux.

    En fait dans ta classe ImageScreen, tu dois créer la méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void paint(Graphics g) {
      super.paint(g)   //Appel des traitements faits par la classe mère
      g.drawImage(bufferedImage, etc...)
    }
    C'est d'ailleurs ce que tu as fait avec la méthode paintComponent()....

    PS : N'oublies pas d'appeler la méthode telle qu'elle était codée dans la classe mère (super.methodeSurchargee()), sinon tu dois réécrire tout ce qu'elle fait !

  14. #14
    Membre du Club Avatar de gandalf_le_blanc
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 161
    Points : 47
    Points
    47
    Par défaut
    Ok je comprend ce que tu veux dire mais dans ce cas là, quelle valuer peut prendre le graphics g ?

    Car si je fais celà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Graphics g;
    ImageScreen image = new ImageScreen("C:\\Documents and Settings\\Administrateur\\Bureau\\jbproject\\Icones\\let1.jpg", ImageScreen.CENTRE);
    image.paintComponent(g);
    g doit etre initialisé mais à quelle valeur ?

  15. #15
    Membre du Club Avatar de gandalf_le_blanc
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 161
    Points : 47
    Points
    47
    Par défaut
    Personne n'a d'idée ?

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 102
    Points
    102
    Par défaut
    Salut,

    bon j'ai pas suivi toute la discussion, alors arrête moi si je dis une connerie. En faitl il faut que tu ajoutes l'image comme attribut de l'objet qui la contient. Ensuite c'est la méthode paintComponent de ce container que tu dois surcharger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void paintComponent(Graphics g) {
       super.paintComponent(g);
       g.drawImage(image);
    }
    Ensuite, pour dessiner l'image, il suffit d'appeler la méthode repaint() du container. Cette méthode ne prend aucun argument. Elle appelle simplement les méthodes paint (qui appellent les paintComponent entre autres) des différents composants en leur passant le Graphics approprié, du coup t'as pas besoin de te soucier de la valeur de ce dernier. Voilà, j'espère que ça t'aidera à résoudre ton prob.

  17. #17
    Membre du Club Avatar de gandalf_le_blanc
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 161
    Points : 47
    Points
    47
    Par défaut
    Voilà ce que j'ai créé comme méthode :

    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
     
    public ImageScreen(String fileName, int mode )
      {
        this.mode = mode;
        bufferedImage = toBufferedImage(Toolkit.getDefaultToolkit().getImage(fileName));
        texture = new TexturePaint(bufferedImage,new Rectangle(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight()));
      }
     
      public void paintComponent(Graphics g)
      {
        switch( mode )
        {
        case TEXTURE :
          Graphics2D g2d = (Graphics2D)g;
          g2d.setPaint(texture);
          g2d.fillRect(0, 0, getWidth(), getHeight() );
          break;
        case CENTRE :
          g.setColor(this.getBackground());
          g.fillRect(0,0,getWidth(), getHeight() );
          g.drawImage(bufferedImage,(getWidth()-bufferedImage.getWidth())/2,(getHeight()-bufferedImage.getHeight())/2,null);
          break;
        default :
          super.paintComponents(g);
        }
      }
     
     
      private BufferedImage toBufferedImage(Image image)
      {	image = new ImageIcon(image).getImage();
     
        BufferedImage bufferedImage = new BufferedImage( image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
        Graphics g = bufferedImage.createGraphics();
     
        g.setColor(Color.white);
        g.fillRect(0, 0, image.getWidth(null),
                   image.getHeight(null));
        g.drawImage(image, 0, 0, null);
        g.dispose();
        return bufferedImage;
      }
    Moi ensuite, dans ma classe principale, je pensais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ImageScreen tmp = new ImageScreen("c:\toto.gif",tmp.CENTRE);
    tmp.paintComponent(g);
    ET voilà mais ca ne fonctionne pas .

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 102
    Points
    102
    Par défaut
    Bon, déjà tu peux pas appeler super.paintComponent dans ta classe ImageScreen dans la mesure où apperemment elle n'hérite d'aucune classe (donc d'aucune classe conteant de méthode paintComponent).

    Donc à mon avis, ce serait pô mal de faire hériter ImageScreen de Image. Ensuite, dans ta classe principale, tu déclares un attribut de type Image, et tu lui affectes l'image que tu souhaites. Tu redéfinis la méthode piantCompent (ou paint si paintComponent n'existe pas pour ce type d'objets) comme signalé dans le post précédent, et tu appelles le repaint de cette classe. Oublies pas d'appeler super.paint ou super.paintComponent quand tu redéfinis (ou surcharge) l'un de ces deux méthodes. En gros, dans ta classe qui doit contenir l'image, t'auras quelque chose du genre :
    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
     
    public classContainer extends JPanel {
       ......
       ......
       private Image image;
     
       ......
       ......
     
    //quelque part (dans une méthode ou dans le constructeur)
    image = new ImageScreen(fileName, mode)
    repaint();
     
       .....
     
       public void paintComponent(Graphics g) {
          super.paintComponent(g);
          g.drawImage(image);
       }
    ...
    }
    Du coup, t'as plus besoin de méthode paintComponent dans la class ImageScreen (de toute façon cette méthode existe pas pour les objets de type Image). Et si tu veux utiliser les BufferedImage, fais hériter ImageScreen de BufferedImage, je pense que ce sera plus simple que de définir une méthode toBufferedImage.

  19. #19
    Membre du Club Avatar de gandalf_le_blanc
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 161
    Points : 47
    Points
    47
    Par défaut
    Bon, j'ai fait comme tu m'as dit pour ImageScreen

    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
     
    public class ImageScreen extends Image
    {
      private int mode;
      private TexturePaint texture;
      private BufferedImage bufferedImage;
     
      public static final int CENTRE = 0;
      public static final int TEXTURE = 1;
     
      public ImageScreen(String fileName, int mode )
      {
        this.mode = mode;
        bufferedImage = toBufferedImage(Toolkit.getDefaultToolkit().getImage(fileName));
        texture = new TexturePaint(bufferedImage,new Rectangle(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight()));
      }
     
      private BufferedImage toBufferedImage(Image image)
      {	image = new ImageIcon(image).getImage();
     
        BufferedImage bufferedImage = new BufferedImage( image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
        Graphics g = bufferedImage.createGraphics();
     
        g.setColor(Color.white);
        g.fillRect(0, 0, image.getWidth(null),
                   image.getHeight(null));
        g.drawImage(image, 0, 0, null);
        g.dispose();
        return bufferedImage;
      }
     
    }
    Mais j'ai une erreur sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class ImageScreen extends Image
    Il me dit qu'il faut que je la mette en abstract !!!
    Comprend pas pkoi ?

    Et sinon, je comprend pourquoi je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Image image;
    image = new ImageScreen (..);
    repaint();
    Mais je voulais une précision.
    Je créé une méthode paintComponent à l'extérieur de ma classe où je fais appel à ImageScreen.
    Et donc ensuite, je dois faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    super.paintComponent();
    Et ca, juste appès le repaint, non ?
    C'est le seul truc que j'ai un peu de mal à comrpendre ?

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 102
    Points
    102
    Par défaut
    Bon pour ton erreur, c'est parce que la classe Image est abstract. Donc si t'étends cette classe faut que tu redéfinisse toutes les méthodes de cette classe déclarée absctract. Une solution pour éviter ça : tu hérites de BufferedImage.

    En ce qui concerne le repaint, je cale pas trop ce que tu veux faire. Alors voilà en gros comment marche le repaint, ça t'aidera pe.
    La méthode repaint d'un objet appelle la méthode paint de cet objet.
    Cette dernière appelle les trois méthodes suivantes :
    - paintBorder (on s'en fout)
    - paintComponent (qui dessine le composant proprement dit)
    - paintChildren qui dessine tous les composants contenus dans l'objet si c'est un container.

    Don pour dessiner ton image, faut surcharger la méthode paintComponent de la classe qui contient to image. Cette classe doit à tout prix être un composant graphique (genre une applet, un panel, une frame ou autre) sinon le code que je t'ai donné marchera pô. Ensuite, le super.paintComponent(Graphics g), c dans la méthode paintComponent que t'as réécrite qu'il faut le mettre. Parce que si tu le fait pas, tu dessineras pas le composant, seulement l'image et y'a de grandes chances pour que tu voies rien. Ensuite t'appelles le reapint pour mettre à jour l'affichage, cette méthode suffit, elle appelera paintComponent(Graphics g) en lui passant le Graphics qu'il lui faut.

    Voilà, dis moi si il y a encore des trucs obscurs pour toi.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Débutant]Erreur compilation classe héritée
    Par Nerziel dans le forum C++
    Réponses: 3
    Dernier message: 02/03/2007, 15h51
  2. Réponses: 15
    Dernier message: 01/11/2005, 13h32
  3. [MASM32][Débutant] Erreur de compilation
    Par Priest dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 02/10/2005, 02h06
  4. Réponses: 12
    Dernier message: 26/08/2005, 10h02
  5. [Débutant]Erreur de compilation inconprehensible
    Par @r$£~%[ dans le forum C++
    Réponses: 15
    Dernier message: 14/08/2005, 20h04

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