Ajouter un panneau sur un dessin [Résolu]

fatalerror 18 Messages postés dimanche 24 mars 2013Date d'inscription 12 novembre 2017 Dernière intervention - 17 août 2015 à 10:13 - Dernière réponse : fatalerror 18 Messages postés dimanche 24 mars 2013Date d'inscription 12 novembre 2017 Dernière intervention
- 20 août 2015 à 17:27
Bonjour,
ça fait un moment que je me casse à vouloir ajouter un JPanel à un objet que j'ai dessiné avec fillPolygon(...). Je commence à me demander si c'est d'ailleurs possible!

voici mes petits bouts de codes sur lesquels je fais des tests:

Classe Cellule
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

public class Cellule extends JPanel {

public Color couleurCellule;
//public Sommet sommet;

public Cellule(Color c){
couleurCellule = c;
}

public void paint(Graphics g){
g.setColor(couleurCellule);
int x[] = {0, 80, 220, 300, 220, 80};
int y[] = {100, 20, 20, 100, 180, 180};
g.fillPolygon(x, y, 6);

}

}


Classe Fenetre:

import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Fenetre extends JFrame {

private static int largeurFenetre = 700,
hauteurFenetre = 500;
private JPanel panneau;

public Fenetre(String titre) {
super(titre);
Cellule cellule = new Cellule(Color.green);
cellule.setBounds(100, 100, 300, 250);
//cellule.setBackground(Color.yellow);
add(cellule);

panneau = new JPanel();
panneau.setLayout(null);
panneau.setBackground(new Color(204, 11, 255));
panneau.setBounds(10, 10, 50, 50);

cellule.add(panneau);
//add(panneau);

setSize(largeurFenetre, hauteurFenetre);
setLocationRelativeTo(null);
setLayout(null);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String args[]) {
new Fenetre("Test").setVisible(true);
}
}

Afficher la suite 

Votre réponse

2 réponses

Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 19 août 2015 à 10:16
+1
Utile
Salut,

Oui c'est possible, cependant tu as oublié les fondamentaux...

- En SWING on ne dessine JAMAIS dans le paint mais dans paintComponent.

- Si tu veux bénéficier des modifications de background de ton objet Cellule il est préférable d'appeler la méthode super.paintComponent au début de ta redéfinition.

- Enfin et surtout (pour ton cas) si tu invalides les layouts il faut le faire pour tout le monde, quand tu fais setLayout(null) tu t'adresses au layout du composant courant, donc au placement des éléments que tu vas mettre dedans, du coup le panneau.setLayout(null) ne sert absolument à rien et par contre le cellule.setLayout(null) qui est absent est important ;)

Ce qui donne:

Classe Cellule
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

public class Cellule extends JPanel {
  private final Color couleurCellule;

  // public Sommet sommet;

  public Cellule(final Color c) {
    couleurCellule = c;
  }
  

  @Override
  public void paintComponent(final Graphics g) {
    super.paintComponent(g);
    g.setColor(couleurCellule);
    final int x[] = { 0, 80, 220, 300, 220, 80 };
    final int y[] = { 100, 20, 20, 100, 180, 180 };
    g.fillPolygon(x, y, 6);
  }

}


Classe Fenetre
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Fenetre extends JFrame {
  private static int        largeurFenetre   = 700;
  private static int        hauteurFenetre = 500;
  private final JPanel      panneau;

  public Fenetre(final String titre) {
    super(titre);
    final Cellule cellule = new Cellule(Color.GREEN);
    cellule.setBounds(100, 100, 300, 250);
    cellule.setBackground(Color.yellow);
    cellule.setLayout(null);
    add(cellule);

    panneau = new JPanel();
    panneau.setBackground(new Color(204, 11, 255));
    panneau.setBounds(10, 10, 50, 50);

    cellule.add(panneau);
    // add(panneau);

    setSize(largeurFenetre, hauteurFenetre);
    setLocationRelativeTo(null);
    setLayout(null);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }

  public static void main(final String args[]) {
    new Fenetre("Test").setVisible(true);
  }
}

Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Twinuts
fatalerror 18 Messages postés dimanche 24 mars 2013Date d'inscription 12 novembre 2017 Dernière intervention - 20 août 2015 à 17:27
0
Utile
Et le tour est joué!!!
Merci bien Twinuts!
Commenter la réponse de fatalerror

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.