Image en arriere plan avec des bouton

ezaki Messages postés 7 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 5 avril 2006 - 2 juin 2004 à 21:14
Twinuts Messages postés 5373 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 10 août 2022 - 3 juin 2004 à 20:14
salut, la je suis raiment mal!!! j ai un gros probleme.
en fait, je fait un scrabble, et j ai fait la partie graphique.
dans cette partie, y a des composants swing comme JButton et des elements paint.
kan je bouge ou je reduis la fenetre, ce qui a dans la fenetre disparait. je dois mettre ca dans un buffer. mais je sais pas du tout utiliser.
j ai regarde un peu les exemples ici, et j ai trouve une petite methode qui consiste a mettre les parties paint dans une image. ce qui permet de bouger la fenetre sans alterer le plateau du jeu. le probleme c'est que cette image vient se poser au dessus de mes JButton et Jlabel!!!
alors comment faire????? la je suis paume, j ai tout essaye sans trouver la solution. plsss help!!! je dois rendre mon projet vendredi:(
voici le code de ma classe (qui utilise d'autres classes):

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.JFrame;
import PanelAvecFond;
import Score;
import Plateau;
import Pion;
import Pioche;
import Joueur;
import Case;

public class PartieDeScrabble extends JFrame{

private Joueur joueur;
private Vector v;
private boolean valide = true;
private boolean vertical;
private String c,motEntre;
private Image offScreen = null;
private JLabel coordxlabel=new JLabel("Coordonnée lettre");
private JLabel coordylabel=new JLabel("Coordonnée chiffre");
private JLabel m=new JLabel("Mot");
private JLabel score=new JLabel("Score : ");
private JLabel scoreMot=new JLabel("Points mot :");
private JTextField mot=new JTextField(12);
private JTextField coordx=new JTextField(5);
private JTextField coordy=new JTextField(5);
private JButton placer=new JButton("Placer");
private JButton passer=new JButton("Passer");
private JRadioButton vertiCheck=new JRadioButton("Vertical",true);
private JRadioButton horiCheck=new JRadioButton("Horizontal");
private ButtonGroup group=new ButtonGroup();
private JPanel panneau=new PanelAvecFond(offScreen);

public PartieDeScrabble(String nom, int positionX, int positionY, int largeur, int hauteur){
super(nom);
setBounds(positionX, positionY, largeur, hauteur);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
joueur = new Joueur("Benjamin");
joueur.completeJeu();
v = joueur.getLettres();
group.add(vertiCheck);
group.add(horiCheck);
panneau.add(coordx);
panneau.add(coordy);
panneau.add(m);
panneau.add(coordxlabel);
panneau.add(coordylabel);
panneau.add(mot);
panneau.add(vertiCheck);
vertiCheck.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
vertical=true;
repaint();
}});
panneau.add(horiCheck);
horiCheck.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
vertical=false;
repaint();
}});
panneau.add(placer);
placer.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
c = coordx.getText();
coordx.setText("");
c = c.toLowerCase();
motEntre = mot.getText();
motEntre = motEntre.toLowerCase();
mot.setText("");
if(joueur.valide(c,motEntre)){
valide = true;
derouleJeu();
repaint();
}
else{
valide = false;
repaint();
}
}
});
panneau.add(score);
panneau.add(scoreMot);
panneau.add(passer);
passer.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
joueur.changerLettres();
valide = true;
repaint();
}
});
setContentPane(panneau);
show();
}

public void paint(Graphics g){
Dimension d = getSize();
if ( offScreen == null ) createOffscreen( d );
drawOffScreen(offScreen.getGraphics());
g.drawImage( offScreen, 0, 0, d.width, d.height, this);
}

public void createOffscreen(Dimension d){
offScreen = createImage( d.width, d.height );
}

public void drawOffScreen(Graphics g){
joueur.getPlateau().dessiner(g);
for(int i=0;i<v.size();i++){
((Pion)v.elementAt(i)).dessiner(g,630+i*51,450);
}
coordxlabel.setLocation(630,200);
coordylabel.setLocation(630,250);
m.setLocation(650,300);
coordx.setLocation(750,200);
coordy.setLocation(750,250);
mot.setLocation(700,300);
vertiCheck.setLocation(850,200);
horiCheck.setLocation(850,250);
placer.setLocation(700,350);
passer.setLocation(800,350);
score.setLocation(650,150);
scoreMot.setLocation(800,150);
Font f1 = new Font("Helvetica",Font.BOLD,20);
g.setFont(f1);
g.drawString(joueur.getScore()+"",720,165);
g.drawString(joueur.getScoreMot()+"",900,165);
Font f2 = new Font("Helvetica",Font.BOLD,35);
g.setColor(Color.blue);
g.setFont(f2);
g.drawString("Le vrai Scrabble",650,100);
if(!valide){
g.setColor(Color.red);
g.drawString("Mot invalide !",670,600);
}
if(v.size()==0){
g.drawString("Partie terminée",670,600);
}
if(joueur.cmpt==7 && v.size()!=0 && valide){
g.drawString("Scrabble!",670,600);
}
}

public void derouleJeu(){
joueur.poserMot(motEntre,c);
joueur.completeJeu();
}
}

11 réponses

Twinuts Messages postés 5373 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 10 août 2022 110
2 juin 2004 à 21:44
exemple pour des label

JLabel label1 = new JLabel()
JLabel label2 = new JLabel()

//constructeur ac initialisation du label

//dans ton paint
JLabel[] tablabel = {label1, label2};
for (int i = 0; i < tablabel .length; i++) {
Rectangle rect2 = tablabel [i].getBounds();
Graphics glabel = g.create(rect2.x, rect2.y, rect2.width, rect2.height);
tablabel [i].paint(glabel);
}
normalement ac cette methode ton souci ne devrai plus se poser
0
Twinuts Messages postés 5373 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 10 août 2022 110
2 juin 2004 à 21:46
sinon fait ta partie graphique dans une classe héritant de java.awt.Canvas
apres pour l'ajouter a un conteneur c comme pour les boutton label et j'en passe
0
ezaki Messages postés 7 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 5 avril 2006
2 juin 2004 à 21:50
je vais de suite essayer ton code :)
sinon je sais pas du tout ce que c un canvas.ni un conteneur d'ailleurs.
0
ezaki Messages postés 7 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 5 avril 2006
2 juin 2004 à 22:05
ta premiere mathode est geniale!!!!
seul b-mol, c'est qu'en fait, kan je fait ta methode pour deux boutons, il me les place un peu decales par rapport aux boutons derriere l'image, et donc kan je click dessus ca marche pas, il faut clicker sur les boutons en arriere plan!
comment ca se fait ce decalage???
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Twinuts Messages postés 5373 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 10 août 2022 110
2 juin 2004 à 22:10
canvas c un composant comme les boutton etc.... a la difference kil sert a dessiner sans avoir a redefinir le paint() de ta frame ou autre donc tt dessins et repaint des dessins se gere dans ton canvas

un conteneur c genre les panel jpanel textpane etc......

perso j'obterai plus pour la solution du canvas

import java.awt.Canvas;
import java.awt.Graphics;

public class dessinCanvas extends Canvas{

public Dimension preferredSize (){ return new Dimension (getSize().width, getSize().height); }
public Dimension minimumSize (){ return preferredSize(); }

public void paint(Graphics g) {
//ici tu fais tes dessins
}

}

//dans la class de ta frame
private dessinCanvas dc = new dessinCanvas();

//dans le constructeur initialise dc a ton gout
//et ajoute le
conteneur.add(dc);
0
ezaki Messages postés 7 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 5 avril 2006
2 juin 2004 à 22:12
finalement, merci beaucoup!!!!! tu me sauve la vie:)
j'ai juste fait un ptit decalage en x et en y pour superposer l'image et l'element:)
voici la ptite modification.
encore merci pour ton aide, la je respire:)

Graphics glabel = g.create(rect2.x+4, rect2.y+30, rect2.width, rect2.height);
0
Twinuts Messages postés 5373 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 10 août 2022 110
2 juin 2004 à 22:13
les composant creer dans ton paint ba fai un addActionListener(actionlistener du bouton en trame de fond);
0
Twinuts Messages postés 5373 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 10 août 2022 110
2 juin 2004 à 22:15
dis toi qd meme que le canvas reste moin gourmand
0
ezaki Messages postés 7 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 5 avril 2006
2 juin 2004 à 22:23
ok, message recu:)
remerci:)
0
ezaki Messages postés 7 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 5 avril 2006
3 juin 2004 à 04:24
import java.awt.Canvas;
import java.awt.Graphics;

public class dessinCanvas extends Canvas{

public Dimension preferredSize (){ return new Dimension (getSize().width, getSize().height); }
public Dimension minimumSize (){ return preferredSize(); }

public void paint(Graphics g) {
//ici tu fais tes dessins
}

}

//dans la class de ta frame
private dessinCanvas dc = new dessinCanvas();

//dans le constructeur initialise dc a ton gout
//et ajoute le
conteneur.add(dc);

concernant ce code, je pige pas bien en fait.
dans la partie paint du canvas, il faut mettre aussi les boutons et labels??? dans ce cas faut aussi redefinir tous les boutons en partie privee du canvas.
et puis l'actionperformed des boutons, on les mets ou? toujours dans le canvas?? je suis un peu largue la
0
Twinuts Messages postés 5373 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 10 août 2022 110
3 juin 2004 à 20:14
tu trouvera l'explication d'un canvas dans la doc java......fo la lire qd meme :-p

sinon non tu ne dessine que tes graphique dans le canvas. Vois les canvas comme le paint d'une frame mais dans un composant plutôt que dans une frame sont paint n'ecrasera pas tes boutons label et autre de plus un canvas a c propre event et listener regarde dans la doc ac un peu de chance tu comprendra son utilité et le gain de memoire par rapport a la premiere methode
0