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 :

JScrollPane dans une JInternalFrame.. possible ?


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 20
    Par défaut JScrollPane dans une JInternalFrame.. possible ?
    Bonjour à tous,

    Je me suis mis au java depuis un peux plus d'une semaine et mes connaissances ne sont donc pas parfaites ^^...
    Aussi je sollicite votre aide pour un petit problème ...

    j'y vais par étape pour être clair :
    J'ai une JInternalFrame (positionnée dans un JDesktopPane).
    Dans cette JInternalFrame j'implémente une classe extends JPanel.
    Dans cette class, je ne fais qu'afficher des images (via ImageIcon).
    Le truc, c'est que je n'arrive pas à avoir de scrollbar alors que je l'ai spécifié.


    maintenant : le code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // ...
       JDesktopPane desktopPane = new JDesktopPane();
       JPanel contentPane = (JPanel)this.getContentPane();
       contentPane.add(desktopPane);
       JInternalFrame f = new JInternalFrame();
       f.setVisible(true);
       panelMap = new Affichage();
       f.getContentPane().add(panelMap);
       f.add(new JScrollPane(panelMap)); // n'a pas l'air de marcher
       desktopPane.add(f);
    // ...

    dans la class Affichage maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class Affichage extends JPanel {
      Affichage() { /* ... */ }
      public void paintComponent(Graphics g) {
        int x = 10, y = 0;
        g.drawImage((new ImageIcon("path/picture.png")).getImage(),  x, y, null); y += 30;
        g.drawImage((new ImageIcon("path/picture.png")).getImage(),  x, y, null); y += 30;
        // plein de fois histoir de dépasser la fenêtre et tester le scrolling
        g.drawImage((new ImageIcon("path/picture.png")).getImage(),  x, y, null); y += 30;
      }
    }
    voilà je pense avoir été suffisement clair et j'attend vos réactions avec impatience, parce que je suis vraiment bloqué là ...

    Merci d'avance !

    PS: je me permet de vous poser la question sachant que j'ai fait toutes les démarches nécessaires avant : javadoc, google, FAQ, recherche developpez, etc.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 20
    Par défaut
    Permettez moi d'insiter... à l'allure où les posts affluent je ne veux pas être oublié
    Peut-etre me suis-je mal exprimé ? Ou bien personne ne sais comment résoudre mon problème ? :/

    s'il vous plaît.... ^^

  3. #3
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Tu ajoute ta panelMap à deux conteneurs différents, normal que ça ne marche pas, soit tu l'ajoute à ton scrollpane, soit tu l'ajoutes au contentpane de ta JInternalFrame, pas aux deux

    Sinon dans ta redéfinition du JPanel pour la classe affichage, fais un appel à super.paintComponeent(g), ça t'éviteras des soucis par la suite...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 20
    Par défaut
    Tout d'abbord merci pour ton interret,

    J'avais effectivement rajouté mon panelMap aux 2 conteners, après correction je l'ai seulement ajouté au scrollpane, mais ça ne règle malheuresement pas mon problème :/

    Sinon dans ta redéfinition du JPanel pour la classe affichage, fais un appel à super.paintComponeent(g), ça t'éviteras des soucis par la suite...
    Je ne comprend pas s'que tu veux dire (pardon)...
    Si c'est pour faire appelle au paintComponent de la class mère, c'est pas ce que je recherche... En effet, la class mère défini d'autres JInternalFrame (qui suivent le même principe que celle décrite au-dessus) qui dessinent d'autres images, donc si je fais appel à super.paintComponant(g) , je ne pourais pas différentier les affichages.
    ou alors j'ai complètement faux ?

    quoi qu'il en soit, mon problème persiste.

  5. #5
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Citation Envoyé par narsi1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       f.getContentPane().add(panelMap);
       f.add(new JScrollPane(panelMap)); // n'a pas l'air de marcher
    Essaie plutôt à la place de ces deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.getContentPane().add(new JScrollPane(panelMap));
    Il faudra aussi que tu redéfinisse la méthode getSize de ta classe Affichage (ou alors que tu appelles setPreferredSize ou setSize dans le constructeur).
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  6. #6
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Citation Envoyé par narsi1
    Tout d'abbord merci pour ton interret,

    Je ne comprend pas s'que tu veux dire (pardon)...
    Si c'est pour faire appelle au paintComponent de la class mère, c'est pas ce que je recherche... En effet, la class mère défini d'autres JInternalFrame (qui suivent le même principe que celle décrite au-dessus) qui dessinent d'autres images, donc si je fais appel à super.paintComponant(g) , je ne pourais pas différentier les affichages.
    ou alors j'ai complètement faux ?
    Dans ton cas le super.paintComponent(g) appelle en fait le paintComponent du JPanel ce qui te permet d'afficher correctement les composants posés sur ce panel

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 20
    Par défaut
    merci encore pour votre soutien, mais malgré celà, je n'y arrive toujours pas

    Il faudra aussi que tu redéfinisse la méthode getSize de ta classe Affichage (ou alors que tu appelles setPreferredSize ou setSize dans le constructeur).
    j'ai essayé tout se que tu as énoncé mais non, ça change pas.

    Au final c'est possible de mettre des scrollbares dans des JInternalFrame ?

    Sinon, si vous avez un exemple sur lequel je peux m'inspirer ce serait sympa.

    Merci encore !

    -----------------------------------------------------------------

    j'ai isolé mon problème pour vous en faire part, afin de faire les tests c'est plus simple ...

    code classe mère :
    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
     
    import javax.swing.*;
     
    public class Plop extends JFrame {
    	private static final long serialVersionUID = 1L;
        // sub-windows
        JInternalFrame f0 = new JInternalFrame();
        // class contenant le Jpanel
        Plip affichage;
     
        public Plop() {
            // JFrame skills
            setTitle("Editeur de carte");
            setVisible(true);
            setSize(800, 700);
            requestFocus();
     
            // Mise en place du conteneur de sous-fenêtres
            JDesktopPane desktopPane = new JDesktopPane();
            JPanel contentPane = (JPanel)this.getContentPane();
            contentPane.add(desktopPane);
     
            // Creation de la sous-fenêtre
            f0.setSize(673, 635);
            f0.setVisible(true);
            f0.setResizable(true);
            affichage = new Plip();
            JScrollPane scrollpane = new JScrollPane(affichage);
            scrollpane.setSize(500, 500);
            f0.getContentPane().add(scrollpane);
    //        f0.getContentPane().add(new JScrollPane(affichage));
            desktopPane.add(f0);
     
            SwingUtilities.updateComponentTreeUI(this);
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        }
     
        public static void main(String[] args) {
    		new Plop();
        }
    }
    code class fille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    import java.awt.*;
    import javax.swing.*;
     
    public class Plip extends JPanel {
    	private static final long serialVersionUID = 1L;
    	Plip() { }
    	public void paintComponent(Graphics g) {
        	  for (int i = 0, l = 0; i < 50; i++, l += 30) {
        	    g.drawImage((new ImageIcon("warn.gif")).getImage(), 0, l, null);
        	  }
    	}
    }
    voilà j'ai essayé avec vos conseils, mais vu que ça ne donnait rien, j'ai laissé tel quel pour éviter les erreurs.
    pour les tests il ne vous faudra qu'une image "warn.gif"

    merci d'avance !

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Par défaut
    salut à toi narsi1,
    je suis egalement sur un truc comme le tient, j'ai éssayé de reprendre ton code, mais rien a faire je ne trouve pas, je serais intéréssé par la solution par contre

    ++
    Marsuwhite

  9. #9
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bon, voila un bout de code minimaliste, testé et approuvé. Pour afficher l'image, je me suis pas pris la tête avec un JPanel, j'ai utilisé un ImageIcon.
    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
    public class Dvpjif extends JFrame {
     
      public final static String FILENAME = "1027.JPG";
     
      public Dvpjif() throws IOException {
        super("Et un JScrollPane, un !");
     
        // Construction de la JInternalFrame
        JInternalFrame frame = new JInternalFrame();
        frame.getContentPane().add(new JScrollPane(new JLabel(new ImageIcon(FILENAME))));
        frame.setBounds(50, 50, 400, 300);
        frame.setVisible(true);
     
        // Construction du JDesktopPane
        JDesktopPane desktop = new JDesktopPane();
        desktop.setPreferredSize(new Dimension(800, 600));
        desktop.add(frame);
     
        // Configuration de la JFrame
        this.setContentPane(desktop);		
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setLocationRelativeTo(null);
        this.setVisible(true);
      }
     
      public static void main(String[] args) throws IOException {
        new Dvpjif();
     }
    }
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 20
    Par défaut
    Merci encore pour le coup de main, mais ce n'est pas exactement ça...
    je m'explique :

    sur UNE SEULE image tel que tu l'as fais, ça marche impeccable :
    Code :
    // Construction de la JInternalFrame
    JInternalFrame frame = new JInternalFrame();
    frame.getContentPane().add(new JScrollPane(new JLabel(new ImageIcon(FILENAME))));
    mais le problème réside justement dans le fait que je voudrais insérer PLUSIEURS images d'où ma 2ième classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import java.awt.*;
    import javax.swing.*;
     
    public class Plip extends JPanel {
      public void paintComponent(Graphics g) {
        for (int i = 0, l = 0; i < 50; i++, l += 30)
        g.drawImage((new ImageIcon("warn.gif")).getImage(), 0, l, null);
      }
    }
    et à la place de
    frame.getContentPane().add(new JScrollPane(new JLabel(new ImageIcon(FILENAME))));
    faire quelque chose comme :
    f0.getContentPane().add(new JScrollPane(new Plip()));

    mais en remplaçant tel quel, ça ne fonctionne pas, et c'est ça que je n'arrive pas à saisir... vous avez une idée ?

  11. #11
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    J'avais pas lu ta classe Plip ! Pour obtenir un objet Image à partir d'un fichier, il faut utiliser ImageIO. ImageIcon est utile pour orner des JLabels ou des JButtons. En plus, tu ouvres et lis le fichier à chaque fois que tu appelles paintComponent, et c'est pas le top.

    Et qu'est-ce qui ne fonctionne pas exactement ?

    Essaie ceci :
    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
    public class Plip extends JPanel {
      private Image image;
     
      public Plip() {
        this("warn.gif");
      }
     
      public Plip(String fileName) {
        image = ImageIO.read(new File(fileName));
        setPreferredSize(new Dimension(image.getWidth(null), image.getHeight(null)));
        setSize(new Dimension(image.getWidth(null), image.getHeight(null)));
      }
     
      public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 1, null);
      }
    }
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 20
    Par défaut
    héhé... là encore tu me donnes une exemple pour ne lire qu'un fichier image : Celà dit, je ne connaissais pas cette façon de faire... mais ce n'est pas tout à fait s'que je recherche

    j'vais essayer d'être plus clair alors :
    dans la JInternalFrame, je voudrais qu'il y ai une mosaïque d'imageS, donc plusieurs images - 30pixels x 30pixels si possible (d'où ma boucle for dans Plip, pour simuler les différentes images).

    si j'arrive à afficher une mosaïque d'imageS scrollable, c'est gagné !
    Voilà, il est là le problème...

    Merci encore pour ton interret !

  13. #13
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Ok, alors pour ça, il te suffit d'avoir un tableau d'images, et tu utilises un GridLayout pour arranger des JLabels qui utilisent des ImageIcons.
    Et désolé d'oublier ce que tu dis, mais avec des pauses comme ça, j'oublie les détails.


    Tu n'es même pas obligé de définir une nouvelle classe pour ça :
    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
    public JPanel buildView(int nbX, int nbY, String[] fileNames) {
     
      if(fileNames.length != nbX * nbY)
        throw new IllegalArgumentException("Parameters \"nbX\"="+ nbX +
                           " and \"nbY\"=" + nbY +
                           " require parameter \"fileNames\" to have a length=" + (nbX * nbY) +
                           " instead of " + fileNames.length);
     
      JPanel panel = new JPanel(new GridLayout(nbX, nbY));
     
      for(int i = 0; i < fileNames.lenght; i++) {
        JLabel l = new JLabel(new ImageIcon(fileNames[i]);
        panel.add(l);
      }
     
      return panel;
    }
    Si tu tiens à définir ceci dans une classe Plip, il te suffit de placer ces instructions dans le constructeur, et tu n'auras pas besoin de surcharger paint ou paintComponent.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 20
    Par défaut
    oops !! j'ai joué au boulet !

    j'ai posé ma question avant de me pencher correctement sur le setPreferredSize(int, int);
    En effet, il suffit de lui indiquer en nbre de pixels la taille qu'il convient, ainsi il peux afficher les barres de scroll...

    Désolé, pour mon poste précédent donc, et un grand MERCI pour vos aides précieuses !

    [EDIT]
    Avec mon prjet actuellement je travaille beaucoup de nuit c'est pourquoi il m'est assez difficile de communiquer avec vous (et ça explique ma tête dans le cul vis-à-vis du setPreferredSize )
    [/EDIT]

  15. #15
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Ok, alors tu as répondu pendant que je postais. Utilise plutôt le GridLayout et les ImageIcon, il arrive qu'avec les images peintes à la main, il y a des problèmes de scroll.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

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

Discussions similaires

  1. Try catch dans une dll - possible ?
    Par Pendary dans le forum C++Builder
    Réponses: 1
    Dernier message: 02/03/2007, 17h48
  2. Réponses: 6
    Dernier message: 18/12/2006, 16h55
  3. JScrollPane dans une JInternalFrame contenant un graphic
    Par Sirkiller dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 08/06/2006, 12h13
  4. lancer un JAR dans une JInternalFrame
    Par kesiahlex dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 18/04/2006, 17h53
  5. Utiliser deux bases dans une requete, possible ?
    Par compu dans le forum Requêtes
    Réponses: 2
    Dernier message: 20/02/2006, 15h09

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