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

2D Java Discussion :

Paint, JPanel et JList


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Par défaut Paint, JPanel et JList
    Bonjour,

    Je cherche actuellement comment réaliser une petite manipulation avec Java2D.

    En gros, je souhaite afficher dans un JPanel (ou tout autre surface de dessin) plusieurs "post-its". Ces post-its sont en réalité des JList qui ont pour image de fond une image de post-it. (L'idée étant de pouvoir sélectionner plusieurs éléments sur chaque post-it).

    Malheureusement, je n'arrive pas à afficher correctement les JList. Ils ne s'affichent dans le JPanel que si je choisi de les "add" pendant le paintComponent() du panel, mais n'importe quel appel aux fonctions de paint des JList ne peint au mieux que le fond.
    Cependant, je ne suis pas très intéressé pour add les JList à mon panel, puisque je n'ai alors aucun contrôle sur l'emplacement où ils apparaissent. Et si plus tard je souhaite les déplacer sur mon panel suivant la souris, c'est coincé.

    J'aimerai plutôt réussir à peindre l'image de fond et le composant JList associé, tout en gardant la possibilité de modifier ce composant à volonté (sélection de ligne, etc).

    J'ai testé à peu près toutes les possibilités de super.paint(g), super.paintComponent(g) ... à tous les endroits possibles.

    Pour simplifier, voici mon code pour le DrawingPane (l'ensemble des post-its est contenu dans un ArrayList postitsList, rempli lors de l'exécution du programme) :

    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
    public class DrawingPane extends JPanel {
     
    		@Override
    		protected void paintComponent(Graphics g) {
    			g.setColor(Color.WHITE);
    			g.fillRect(2, 2, 470, 442);
     
    			for(int i = 0; i < postitsList.size(); i++) {
    				Postit p = postitsList.get(i);
    				p.setX(i*150);
    				p.setY(0);
    				Kitman.setHeight(p, 150); //méthodes de dimensionnement
    				Kitman.setWidth(p, 150);
    				p.setBorder(BorderFactory.createLineBorder(Color.black)); //pour visualiser les contours
    				p.setCellRenderer(new MyCellRenderer()); //pour rendre le fond des cellules opaques
    				p.setOpaque(false);
    				p.draw(g); //d'après les cours développez.net; pour l'instant ça n'affiche que l'image de fond
    				//this.add(p); //ce que je ne veux pas utiliser, car add manque de controle à mon goût
    			}
     
    			this.revalidate();
     
    			g.setColor(Color.BLACK);
    			g.drawRect(2, 2, 469, 441);
    		}
    	}
    Et le code des Post its :

    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
     
     
    public class Postit extends JList {
     
    		BufferedImage image = null;
    		int w = 150;
    		int h = 150;
    		int x = 0;
    		int y = 0;
     
    		public void draw(Graphics g) {
    			super.paintComponent(g);
    			g.drawImage(image, x, y, w, h, null);
    		}
     
                    //avec ou sans ... ça ne change rien
    		@Override
    		protected void paintComponent(Graphics g) {
    			super.paintComponent(g);
    		}
     
    		public void setX(int x) {
    			this.x = x;
    		}
     
    		public void setY(int y) {
    			this.y = y;
    		}
     
    		public int getX() {
    			return this.x;
    		}
     
    		public int getY() {
    			return this.y;
    		}
     
    		public Postit(String[] data) {
     
    			super(data);
     
                            //création de l'image de fond
    			URL imageURL = Kitman.class.getResource("images/postit.png");
    			BufferedImage im = null;
    			try {
    				im = ImageIO.read(imageURL);
    			} catch (IOException e) {
    				System.out.println("Impossible d'ouvrir l'image du post it.");
    			}
     
    			//Calcul de la taille finale
    			w = im.getWidth(null);
    			h = im.getHeight(null);
     
    			image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
     
    			Graphics2D g2d = image.createGraphics();
     
    			double rotation = (double)(Math.random() * 10) - 5 ;
    			g2d.rotate(rotation/180);
     
    			g2d.drawImage(im,
    					0, 0, w, h, 
    					0, 0, w, h,
    					null);
    		}
    	}
    Merci énormément aux personnes qui prendront un peu de temps pour m'aiguiller ! Si quelque chose n'est pas clair, dites le moi.

  2. #2
    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
    Totalement foireux ton truc.

    Il ne faut surtout pas modifier ou placer des composants dans un paintComponent.

    La méthode paintComponent est destinée à faire du dessin, rien d'autre.

    Donc si tu veux utiliser des composants places les normalement via le layout de ton choix dans le code prévu pour (action listener, constructeur & cie). Et penses à faire un appel à super.paintComponent dans ta redéfinition de paintComponent.

    Sinon pour rendre tes composants redimensionnables: http://www.jroller.com/santhosh/entr...ble_components

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Par défaut
    Merci beaucoup pour le lien, c'est tout à fait ce que je veux faire. Je devrais m'en sortir en regardant du côté des AbsoluteLayout & co, donc. Comme tu dis ça sera surement bien plus propre !

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    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 904
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par sinok Voir le message
    Totalement foireux ton truc.

    Il ne faut surtout pas modifier ou placer des composants dans un paintComponent.
    Dans la mise en oeuvre oui mais dans le principe pas tant que ca.
    Puisque c'est ainsi que fonctionnent tous les renderers pour les JList, JComboBox, JTree et JTable : un composant est cree hors affichage, redimensionne a la bonne taille, parametre pour faire son affichage (la fameuse methode getXXXRenderer(...) qu'on doit surchager a chaque fois) et puis tampone au bon endroit.
    Par contre ce composant n'appartient pas a la hierarchie graphique .
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Par défaut
    Bon c'est génial ça correspond parfaitement à ce que je cherchais à faire. En retouchant les classes proposées j'ai pu arriver à mon résultat, et avec un code propre et compréhensible !

    J'ai mis le background de la JList dans le paintComponent, et je gère la transparence des cellules avec le renderer. Pour centrer la JList sur mon image de post it, j'ai bidouillé et appliqué une EmptyBorder(0,20,0,20) à chaque cellule. Je pense qu'il y a plus propre, mais je ne vois pas trop comment faire.

    En tout cas, merci encore pour le lien et la rapidité de réponse !

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

Discussions similaires

  1. [JPanel] paint, paintComponent et repaint ?
    Par Pill_S dans le forum Composants
    Réponses: 8
    Dernier message: 08/02/2013, 17h38
  2. JPanel dans JList
    Par Coko56 dans le forum Agents de placement/Fenêtres
    Réponses: 0
    Dernier message: 14/06/2012, 16h54
  3. JPanel et JList
    Par Bitte dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 07/07/2011, 22h52
  4. Problème paint JPanel
    Par noz101 dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 16/05/2011, 15h47
  5. Paint JPAnel dans un JPanel
    Par dawaman dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 01/05/2010, 16h29

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