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 :

Plusieurs dessins sur même Panel + redimensionnement


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 74
    Par défaut Plusieurs dessins sur même Panel + redimensionnement
    Bonjour,
    J'ai le problème suivant que je n'ai pas réussi à résoudre, après plusieurs heures d'essais infructueux et quelques exemples étudiés.
    Je veux pouvoir dessiner :
    1) un rectangle dont les dimensions vont s'adapter à la fenêtre,
    2) un cercle qui doit exister dans la "même case" du conteneur parent (i.e. dans le getContentPane(... , BorderLayout.CENTER)) que le rectangle, éventuellement pouvoir se superposer avec.

    J'ai créé deux JPanel pan (contenant le rectangle) et pan2 (contenant le cercle), et je les mets dans un JLayeredPane pour gérer la transparence (setOpaque).

    J'arrive à avoir :
    a) soit seulement le rectangle redimensionnable, en utilisant un "this.getWidth()" pour définir sa longueur quand je le dessine dans le JPanel, mais alors je n'arrive pas à combiner avec le cercle dans le JLayeredPane. En fait, pour que ça marche, il faut que je mette pan directement dans le getContentPane de la fenêtre...

    b) soit le rectangle et le cercle, mais le rectangle est de taille fixe, car j'utilise un setBounds sur mes panels, et donc la taille est fixée.
    ...

    Merci pour votre aide.

    PS : Question complémentaire (je ne suis pas très avancé en Java) : dans le "this.getWidth()" que j'utilise dans le drawRect, à quoi (quel objet) fait référence exactement this ? Pourquoi est-ce que cette méthode ne marche pas quand j'utilise le "this.getWidth()" dans le setBounds ? (L'objet n'est visiblement plus le même...). J'ai vérifié que dans ce cas, this.getWidth() vaut 0 et donc on ne voit pas les objets...

    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
     
    import javax.swing.*;
    import java.awt.*;
     
    public class totojava extends JFrame {
     
    	private JLayeredPane lp ;
    	private JPanel pan ;
    	private JPanel pan2 ;
     
    	public totojava() {
    		// PREMIER PANEL : RECTANGLE 
    		pan = new JPanel() {
    			public void paintComponent(Graphics g){
    				g.setColor(Color.black);
    				g.drawRect(100, 100, this.getWidth()-150, 200) ;
    				// ICI, THIS = ????? 
    			}           
    		};
     
    		// SECOND PANEL : CERCLE 
    		pan2 = new JPanel() {
    			public void paintComponent(Graphics g){
    				g.setColor(Color.blue);
    				g.fillOval(200, 50, 100, 100);
    				g.drawLine(250, 100, 250, 50);
    			}           
    		};
     
     
    		// SANS CES DEUX LIGNES, RIEN NE S'AFFICHE !
    //		pan.setBounds(50, 50, 600, 400) ;
    //		pan2.setBounds(200, 50, 400, 200) ;
    		pan.setBackground(Color.YELLOW) ;
    		pan2.setBackground(Color.CYAN) ;
    		lp = new JLayeredPane() ;
     
    		lp.add(pan2, new Integer(2)) ;
    		lp.add(pan, new Integer(1)) ;
    		pan2.setOpaque(!pan.isOpaque()) ; // OPPOSE DE LA VALEUR PAR DEFAUT -> RENDRE LE FOND TRANSPARENT
    		getContentPane().add(lp, BorderLayout.CENTER) ;
     
    	}
     
    	public static void main(String[] args) {
    		JFrame f = new totojava(); 
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		f.setSize(800, 400);
    		f.setLocationRelativeTo(null);
    		f.setVisible(true);
    	}
    }

  2. #2
    Membre actif Avatar de arafat877
    Inscrit en
    Septembre 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 46
    Par défaut Solution
    Salut !
    Si tu veux gérer la transparence dans tes composants, alors je te propose cet
    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    import java.awt.AlphaComposite;
    import java.awt.Color;
    import java.awt.Composite;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
     
    /**
     *
     * @author Arafat Bouchafra
     * @Date   4 déc. 2010
     * @Time   09:52:54
     */
     
    public class TransparencyExample extends JPanel {
      private static int gap=10, width=60, offset=20,
                         deltaX=gap+width+offset;
      private Rectangle
        blueSquare = new Rectangle(gap+offset, gap+offset, width, width),
        redSquare = new Rectangle(gap, gap, width, width);
     
      private AlphaComposite makeComposite(float alpha) {
        int type = AlphaComposite.SRC_OVER;
        return(AlphaComposite.getInstance(type, alpha));
      }
     
      private void drawSquares(Graphics2D g2d, float alpha) {
        Composite originalComposite = g2d.getComposite();
        g2d.setPaint(Color.blue);
        g2d.fill(blueSquare);
        g2d.setComposite(makeComposite(alpha));
        g2d.setPaint(Color.red);
        g2d.fill(redSquare);
        g2d.setComposite(originalComposite);
      }
     
      public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        for(int i=0; i<11; i++) {
          drawSquares(g2d, i*0.1F);
          g2d.translate(deltaX, 0);
        }
      }
     
      public static void main(String[] args) {
     
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Transparence");
                frame.setSize(11*deltaX + 2*gap, deltaX + 3*gap);
                frame.setContentPane(new TransparencyExample());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
      }
    }
    Bon courage

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 74
    Par défaut
    Citation Envoyé par arafat877 Voir le message
    Salut !
    Si tu veux gérer la transparence dans tes composants, alors je te propose cet
    exemple :

    ...
    Je te remercie pour cet exemple intéressant, je ne connaissais pas du tout ce "AlphaComposite". Cependant, ça ne répond à aucune de mes deux questions, et ça n'est pas du tout ce que je recherche.
    Si j'ai bien compris l'exemple que j'ai trouvé, le "setOpaque" sert (entre autres, et c'est ce qui m'intéresse ici) à rendre le background d'un panel "transparent" (non opaque), afin que l'on puisse superposer deux tels objets (sans aucun effet de transparence).
    Dans mon cas, j'ai deux JPanel à faire cohabiter au même endroit. L'idée, c'est qu'ensuite je manipule l'une des deux formes par l'intermédiaire de son JPanel conteneur (car j'avais compris qu'on ne pouvait pas manipuler des "graphics" (rectangle, cercle, etc.) directement. Mais peut-être n'ai-je pas bien compris ?...)

  4. #4
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    Salut,

    Citation Envoyé par totojava Voir le message
    this.getWidth()
    this fait référence au primer panneau.


    Citation Envoyé par totojava Voir le message
    L'idée, c'est qu'ensuite je manipule l'une des deux formes par l'intermédiaire de son JPanel conteneur (car j'avais compris qu'on ne pouvait pas manipuler des "graphics" (rectangle, cercle, etc.) directement. Mais peut-être n'ai-je pas bien compris ?...)
    tu peux manipuler tes formes graphiques sans passer par une intermédiaire : tu fais clique souris sur le shape à manipuler et tu détermine par la suite l'objet correspondant(qui contient les informations sur la forme 2D dessinée) en parcourant le vecteur qui contient déjà l'ensemble des formes dessinées sur ton panneau

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 74
    Par défaut
    Citation Envoyé par slim_java Voir le message
    Salut,



    this fait référence au primer panneau.




    tu peux manipuler tes formes graphiques sans passer par une intermédiaire : tu fais clique souris sur le shape à manipuler et tu détermine par la suite l'objet correspondant(qui contient les informations sur la forme 2D dessinée) en parcourant le vecteur qui contient déjà l'ensemble des formes dessinées sur ton panneau
    Merci pour ces infos, ça va dans mon sens. Par contre, je ne vois pas qui est le premier panneau dont tu parles ? Je précise ma question : lorsque je fait "this.getWidth" dans pan, je suis dans une classe interne anonyme, non ? Normalement, le this est celui de l'objet courant ? Quel est cet objet ?
    Et lorsque je fais le "this.getWidth" dans le constructeur totojava, pourquoi j'obtiens 0, i.e. une valeur différente du "this.getWidth" de pan ?
    Je souhaite bien comprendre ce point qui me paraît fondamental...

    Sinon, quelle est la méthode pour "abonner" un objet graphique (ici mon drawRect) à un évènement ? J'imagine qu'il faut passer par pan.g, mais je ne vois pas la démarche (et je n'ai rien lu à ce sujet dans les livres que j'ai lus).

    EDIT : Je viens de trouver des infos sur la classe Shape et le Graphics2D. Je vais poursuivre ma lecture, mais je suis toujours preneur d'informations qui me feront aller plus vite !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 74
    Par défaut
    tu peux manipuler tes formes graphiques sans passer par une intermédiaire : tu fais clique souris sur le shape à manipuler et tu détermine par la suite l'objet correspondant(qui contient les informations sur la forme 2D dessinée) en parcourant le vecteur qui contient déjà l'ensemble des formes dessinées sur ton panneau
    Notamment, quelles sont les méthodes à utiliser pour avoir le "vecteur qui contient déjà l'ensemble des formes dessinées", et à quel objet s'appliquent-elles ? J'ai du mal à voir...

  7. #7
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Par défaut
    En patientant un peu, je pense qu'une nouvelle réponse te suggérera de modifier ton BIOS pour régler tes problèmes...

    La réponse la plus simple reste toutefois d'ajouter la ligne suivante à ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lp = new JLayeredPane();
    lp.setLayout(new OverlayLayout(lp)); // Cette ligne de code là.
    Ce LayoutManager n'est pas forcément le plus connu, mais il est très utilisé avec les JLayeredPane. Avec lui, c'est un peu comme si chaque composant se retrouvait au CENTER d'un BorderLayout avec un redimensionnement automatique à la taille de la fenêtre. Et c'est justement ce redimensionnement qui permet à pan.getWidth() de retourner une valeur non nulle. Au passage :
    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
    public class Outter {
     
    	public void f() {
    		System.out.println("Outter.f()");
    	}
     
    	public void g() {
    		System.out.println("Outter.g()");
    	}
     
    	public class Inner {
     
    		public void f() {
    			System.out.println("Inner.f()");
    		}
     
    		public void run() {
    			f();
    			this.f(); // Redondant.
    			Outter.this.f();
    			g();
    			// Inner.this.g(); --> Erreur de compilation.
    			Outter.this.g(); // Redondant.
    		}
    	}
     
    	public static void main(String[] arguments) {
    		Outter outter = new Outter();
    		outter.f();
     
    		Inner inner = outter.new Inner();
    		inner.f();
    		// inner.g(); --> Erreur de compilation.
    		inner.run();
    	}
    }
     
    /*
    Sortie du programme :
     
    Outter.f()
    Inner.f()
    Inner.f()
    Inner.f()
    Outter.f()
    Outter.g()
    Outter.g()
    */
    J'utilise une classe interne plutôt qu'une classe interne anonyme, mais le fonctionnement est le même.

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

Discussions similaires

  1. [1.x] Plusieurs sites sur même hébergement
    Par nims dans le forum Symfony
    Réponses: 7
    Dernier message: 18/03/2009, 23h22
  2. dessiner sur un panel ou sur un picturebox
    Par olibara dans le forum C#
    Réponses: 12
    Dernier message: 13/06/2008, 23h24
  3. Plusieurs oracle sur même machine
    Par kheduch dans le forum Import/Export
    Réponses: 41
    Dernier message: 25/04/2008, 14h29
  4. Startup plusieurs database sur même serveur
    Par dumser1 dans le forum Administration
    Réponses: 5
    Dernier message: 06/09/2007, 09h40
  5. [JFrame] réafficher plusieurs fois un même panel à l'écran
    Par Monkeyget dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 01/04/2005, 14h29

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