Replic4
Messages postés8Date d'inscriptionvendredi 31 mars 2006StatutMembreDernière intervention11 août 2006
-
10 août 2006 à 11:17
snowfire166
Messages postés1Date d'inscriptionjeudi 20 mars 2008StatutMembreDernière intervention 2 avril 2008
-
2 avril 2008 à 22:02
Bonjour,
J'ai créé une fenêtre (JFrame) avec une image de fond en recréant un JComponent. Mon problème est de réussir à placer des objets au dessus sans cacher le reste de l'image par un JPanel.
Mon code :
public class MaFenetre extends JFrame
{
MaFenetre()
{
...
// FondAvecImage("lien vers l'image") Hérite de JComponent
this.setContentPane(new FondAvecImage("lien vers l'image"));
// Code pour placer mes composants
this.setVisible(true);
...
}
}
Savez vous comment placer des composants comme des boutons, des labels sans ajouter de JPanel ? Ce qui viendrait devant l'image de fond !!
Ensuite, existe un Layout permettant de placer ses composants en utilisant des coordonnés ?
public class JPanelImageBg extends JPanel{//JComponent { evite d'etendre de JComponent qd tu veux faire un panel
private static final long serialVersionUID = 5885901521118705414L;
public static final int CENTRE = 0;
public static final int TEXTURE = 1;
private int mode = CENTRE;
private TexturePaint texture = null;
private BufferedImage bufferedImage = null;
public static void main(String [] args){
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(3);
f.setSize(new Dimension(300, 300));
f.setLocationRelativeTo(null);
JPanelImageBg bg = new JPanelImageBg("img.jpg", JPanelImageBg.CENTRE);
for(int i = 1; i < 11; i++)//juste pour tester l'affichage
bg.add(new JButton(""+i));
f.setContentPane(bg);
f.setVisible(true);
}
public JPanelImageBg(String fileName, int mode) {
switch(mode){
case TEXTURE://pour ne pas charger les ressources inutilisement
this.mode = mode;
this.texture = new TexturePaint(bufferedImage, new Rectangle(0, 0,
bufferedImage.getWidth(), bufferedImage.getHeight()));
break;
case CENTRE:
default:
this.mode = CENTRE;
this.bufferedImage = this.toBufferedImage(getToolkit()
.getImage(fileName));
break;
}
}
public void paintComponent(Graphics g) {
switch (mode) {
case TEXTURE:
if(texture != null){//petite securitee
Graphics2D g2d = (Graphics2D) g;
g2d.setPaint(texture);
g2d.fillRect(0, 0, getWidth(), getHeight());
}
break;
case CENTRE:
if(bufferedImage != null){//petite securitee
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);//si tu le fais ici cela n'affichera jamais les composants
}
super.paintComponents(g);
}
/**
* Transforme une image en bufferedImage
* @param image l'image a transformer
* @return Retourn l'image convertie ou null (si l'image source ete null)
*/
private BufferedImage toBufferedImage(Image img) {
if(img == null) return null;//si l'image est null pas besoin de continuer
if (img instanceof BufferedImage)//si l'image est deja une instance de BufferedImage on la retourne
return (BufferedImage) img;
// On s'assure que l'image soit bien chargee
img = new ImageIcon(img).getImage();
//Determine si l'image contient ou non un pixel de transparence
boolean hasAlpha = hasAlpha(img);
int type;//type de couleur
// On creer un BufferedImage ayant un format compatible avec l'environement graphique du pc
BufferedImage bi = null;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
try {
//Maintenant on determine si le nouveau BufferedImage aura ou non un pixel de transparence
type = Transparency.OPAQUE;
if (hasAlpha) type = Transparency.BITMASK;
// Creation de notre nouveau BufferedImage
bi = ge.getDefaultScreenDevice()
.getDefaultConfiguration().
createCompatibleImage(
img.getWidth(null), img .getHeight(null), type);
} catch (HeadlessException e) {
// Le systeme n'as pas d'ecran ?
}
if (bi == null) {
// Si le BufferedImage precedement creer est null on en creer un avec un model par defaut
type = BufferedImage.TYPE_INT_RGB;
if (hasAlpha) type = BufferedImage.TYPE_INT_ARGB;
bi = new BufferedImage(img.getWidth(null), img.getHeight(null), type);
}
// On copie l'image dans le BufferedImage
Graphics g = bi.createGraphics();
// maintenant on la dessine
g.drawImage(img, 0, 0, null);
g.dispose();
return bi;
}
/**
* Test si une image contient ou non un canal alpha
* @param image l'image a tester
* @return retourne vrai si elle en contien un
*/
private boolean hasAlpha(Image image) {
// si l'image et deja un BufferedImage alors pas besoin de checker le model de couleur
if (image instanceof BufferedImage)
return ((BufferedImage) image).getColorModel().hasAlpha();
//utilisation d'un 'grabber' pour retrouver le model de couleur de l'image
//normalement le grab du pixel en haut a gauche est suffisant.
PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false);
try {
if(!pg.grabPixels()) return false;
} catch (InterruptedException e) {
}
// on check si le model de couleur correspond ou non a un chanel alpha
return pg.getColorModel().hasAlpha();
}
}
------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 10 août 2006 à 22:01
Salut,
essai de faire plutot
JPanelImageBg wallPaper = new JPanelImageBg("img/bureau_1.png", 0);
this.setContentPane(WallPaper);
wallPaper.setLayout(new BorderLayout());
Bar = new menuBar("SOUTH"); // herite de JPanel
//veille que les composant que tu place ne soit pas opaque sinon tu ne verras plus l'image
wallPaper.add(Bar, BorderLayout.SOUTH); //ou autre
sinon le code que je demande le plus c'est JPanelImageBg
------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
Replic4
Messages postés8Date d'inscriptionvendredi 31 mars 2006StatutMembreDernière intervention11 août 2006 11 août 2006 à 09:56
Voila la classe JPanelImageBg. Je tiens à préciser que ce n'est pas moi qui l'ai codé. Elle viens d'un autre site. (Je ne sais pas si je dois citer l'auteur, alors dans le doute je ne le fais pas):
snowfire166
Messages postés1Date d'inscriptionjeudi 20 mars 2008StatutMembreDernière intervention 2 avril 2008 2 avril 2008 à 22:02
Bonsoir a tous,
D'abord merci a tous pour les explications fournies sur le forum!
J'aurais aimé savoir s'il était possible d'ajouter un Canvas au dessus d'une image de fond? j'ai bien essayé en mettant dans votre programme (dans le main) et en specifiant paint:
public static void main(String [] args){
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(3);
f.setSize(new Dimension(400, 300));
f.setLocationRelativeTo(null);
JPanelImageBg bg = new JPanelImageBg("logo_ustl.gif", JPanelImageBg.CENTRE);
Canvas c = new Canvas();
bg.add(c);
f.setContentPane(bg);
f.setVisible(true);
}
public void paint (Graphics g) {
int x=3; // initialisation des abscisses
for (int y=15;y<200;y+=10) {
g.drawString("+-----------+-----------+-----------+-----------+",x-2,y);
}
}
mais cela ne fonctionne pas... HELP ME s'il vous plait!
L'objectif final est d'afficher le contenu de quatre tas de carte sous la forme :
voila un jar executable d'une version qui fonctionne telle que je veux (faite par moi) mais a laquelle je voudrais rajouter une image de fond : http://rapidshare.com/files/104375883/demo.jar.html et taper java -jar demo.jar