Probleme pour Dessiner un graphics avec swing

Iko01 Messages postés 6 Date d'inscription mardi 9 juin 2009 Statut Membre Dernière intervention 15 juin 2009 - 12 juin 2009 à 00:31
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 24 juin 2010 à 17:49
Bonjour à tous, voila actuellement je suis sur un petit projet de fin d'année qui consiste à réaliser le jeux "tours de Hanoï" par java, sauf problème je n'arrive pas à dessiner sur ma fenêtre JFrame des graphics, ca fait a peine un ans que j connais java, je d'abord appris a manipuler les méthodes graphcis, mais toute fois je n'arrive pas à gerer les methodes swing, pour tant j'ai bien essayé d'utiliser lé methodes paint() et paintComponent() mais ca ne marche tjs pas.

voila il est pt pas parfait le programme encore mais le principe est le suivant :
- avec une class hanoi (class principal) j'utilise ft d'une class Fenetre, avec encore deux autres type de class afin de pouvoir gerer les poteau puis les disque.
-pour le transferer des donnée j'ai choisi des vector pour les disque des poteau et un vector de poteau pour la class hanoi (toute fois il n'est pas encore complex à fin de pouvoir gerer les disque sur les poteau) car je suis encore bloké à comment dessiner les poteau.

voici les class principal apellé par le jeux :

public class Hanoi {

    /**
     * @param args the command line arguments
     */
   
    private final int hauteur_pile_max = 15;
    private int hauteur_init = 0;
    static private int nb_disque = 0;
    private int n;
    private boolean bot;
    private String deplacement;
    private Fenetre ft = new Fenetre ();
    private static Vector <Disque> d = new Vector ();
    private static Vector ptx = new Vector ();
    private final int delta_x = 15;
    private final int delta_y = 15;
   
   
    public static void solution (int hauteur,Vector<Disque> A,Vector<Disque> C,Vector<Disque> B,Fenetre ft1,Vector<Disque> resultat)
     {
     if(nb_disque>0){
     solution((nb_disque-1),A,B,C,ft1,resultat);
     resultat.addElement(A.get(nb_disque));
     resultat.addElement(C.get(nb_disque));
     solution((nb_disque-1),B,C,A,ft1,resultat);
     }
    }
   
    public Vector Poteaux(Vector <Disque> v){
        Vector Ptx = new Vector();
        for (int i = 0; i< 3; i++ ){
            switch (i){
                case 0 :Poteau A = new Poteau(v);
                        Ptx.add(i, A);
                case 1 :Poteau B = new Poteau(v);
                        Ptx.add(i, B);
                case 2 :Poteau C = new Poteau(v);
                        Ptx.add(i, C);
            }
           }
        return Ptx;
    }
    public Vector <Disque> Disque(int hauteur){
            Vector <Disque> DisqueP = new Vector();
            hauteur_init = hauteur;
            for (int i = 0; i<hauteur; i++ ){
                Disque nDisque = new Disque(hauteur_init);
                DisqueP.add(i, nDisque);
           }
        return DisqueP;
        }

    public static void main(String[] args) {
        Hanoi p = new Hanoi();
        p.ft.initFrame();
        Graphics g = p.ft.getGraphics();
        System.out.println("Entrez le nombre de Disque :");
        nb_disque = Input.readInt();
        d = p.Disque(nb_disque);
        ptx = p.Poteaux(d);
        p.ft.paintPoteau(g,ptx);
    }

}

// La class Fenetre

public class Fenetre extends JFrame {
   
    private Container contenaire = new Container();
    private JLabel nmbAnneauLabel = new JLabel();
    private JTextField nmbAnneauField = new JTextField();
    private JButton simulationBouton,confirmerBouton = new JButton();
    private JComponent Cp;
    private int nombreAnneau;
    private final int hauteur = 500;
    private final int largeur = 700;
    private final int delta_x = 15;
    private final int delta_y = 15;
    public Fenetre (){
        this.setVisible(true);
        this.toFront();
        this.setTitle("Tours d'hanoï");
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setSize(largeur, hauteur);
        setLocationRelativeTo(null);

    }

    public void initFrame(){

        contenaire = getContentPane();
        contenaire.setBackground(Color.white);
        contenaire.setLayout(null);

        simulationBouton=new JButton("commencer");
        simulationBouton.setBounds(500,15,150,25);
        simulationBouton.setBackground(Color.black);
        simulationBouton.setForeground(Color.red);
        contenaire.add(simulationBouton);

        confirmerBouton=new JButton("Voir Solution");
        confirmerBouton.setBounds(250,delta_y,200,25);
        confirmerBouton.setBackground(Color.black);
        confirmerBouton.setForeground(Color.red);
        contenaire.add(confirmerBouton);

        setVisible(true);
    }
    public void paintPoteau(Graphics g, Vector v)
    {
        Poteau A = new Poteau(v.elementAt(0).d);
        Poteau B = new Poteau(v.elementAt(1).d);
        Poteau C = new Poteau(v.elementAt(2).d);
        int x = 0;
        int y = 50;
        x = WIDTH/4 ;
        A.setCentre_x(x);
        A.setCentre_y(y);
        paint(g);
        A.drawPoteau(g);
        super.paint(g);
        x = WIDTH/2 ;
        B.setCentre_x(x);
        B.setCentre_y(y);
        B.drawPoteau(g);
        x = 3*WIDTH/4 ;
        C.setCentre_x(x);
        C.setCentre_y(y);
        C.drawPoteau(g);

        }
}

// les class poteau et disque

private int hauteur_pile;
    private int pos_x ;
    private int pos_y ;
    private final int hauteur = 20;
    private Disque dl ;
    Vector <Disque> d = new Vector ();
    private final int delta_x = 15;
    private final int delta_y = 15;
    private int largeurBase;
   
    public Poteau(Vector <Disque> v){
       this.hauteur_pile = v.size();
       d = v;
    }

    public void drawPoteau(Graphics g){
        //base poteau
           this.largeurBase = 2*d.size()*delta_x;
           g.setColor(Color.RED);
           g.fillRect(pos_x - d.size()*delta_x, pos_y + hauteur, largeurBase, hauteur);
        // Hauteur fexible par rapport au nombre de disque
           g.setColor(Color.BLACK);
           g.drawLine(pos_x, pos_y, pos_x, (pos_y+hauteur+(d.size()*delta_y)));
           System.out.println("Graphics: " + g );
    }
   
    public int getCentre_x(){
        return this.pos_x;
    }
    public int getCentre_y(){
        return this.pos_y;
    }
    public void setCentre_x(int x){
        this.pos_x = x;
    }
    public void setCentre_y(int y){
        this.pos_y = y;
    }
}

public class Disque {
    private final int delta_x = 15;
    private final int delta_y = 15;
    private int largeur = 0;
    private int nDisque;

    public Disque (int n){
        nDisque = n;
    }
    public void  PaintDisque(Graphics g, Poteau p){
        int x = 0;
        int y = 0;
        x = coin_haut_gauche_x (p);
        y = coin_haut_gauche_y (p);
        g.setColor(Color.GRAY);
        g.fillRect(x, y, 2*largeur*delta_x, delta_y);
        System.out.println("Graphics: " + g );
    }
    public int coin_haut_gauche_x (Poteau poteau_acc){
        int x = 0;
        x = poteau_acc.getCentre_x()- this.largeur*delta_x;
        return x;
    }
    public int coin_haut_gauche_y (Poteau poteau_acc){
        int y = 0;
        y = poteau_acc.getCentre_y()- nDisque*this.delta_y*2;
        return y;
    }
   
    public void removeDisque(Graphics g, Poteau poteau_acc){
        int x = 0;
        int y = 0;
        x = coin_haut_gauche_x(poteau_acc);
        y = coin_haut_gauche_x(poteau_acc);
        g.setColor(Color.WHITE);
        g.fillRect(x, y, largeur, delta_y);
    }
}

voila si quelqu'un pourrais prendre un petit instant pour m'expliquer un peu pourquoi mon struction paint() ca serais sympa!!

3 réponses

cs_neone Messages postés 96 Date d'inscription mercredi 23 novembre 2005 Statut Membre Dernière intervention 7 mars 2011
12 juin 2009 à 10:25
Bonjour,
ta pensé a super.paintComponent(g)?
boncourage.
0
Iko01 Messages postés 6 Date d'inscription mardi 9 juin 2009 Statut Membre Dernière intervention 15 juin 2009
12 juin 2009 à 11:03
voila depuis hier soir je me suis penche un peu dessus et fait quelque modifie,j'arrive a conclusion que je suis null en info lool^^ en fin bref je tentai alors de crée juste une ligne et la je vu que j'avais pt un gros probleme lool
J'ARRIVE MM PAS à dessiner une ligne sur Jframe :/

voila ce d'apres ce que j compris avec paint() :

public class Hanoi {
private Fenetre ft = new Fenetre ();

public class Fenetre extends JFrame {
    public Fenetre (){
        this.setVisible(true);
        this.toFront();
        this.setTitle("Tours d'hanoï");
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setSize(largeur, hauteur);
        setLocationRelativeTo(null);
    }
public void initFrame(Graphics g){
        paint(g);
        g.setColor(Color.BLACK);
        g.drawLine(50, 50, 350, 350);
        super.paint(g);
      }}
public static void main(String[] args) {
        Hanoi p = new Hanoi();
        Graphics g = p.ft.getGraphics();
        p.ft.initFrame(g);
}}

ca marche tjs pas...
ca l'air pas si compliqué mais j'avoue que ca je suis stocker, je n'arrive pas à dessiner mes poteau sur ct fenetre...
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
24 juin 2010 à 17:49
Tu devrais plutôt surcharger la méthode paintComponent de JPanel et faire frame.add(new JPanelModifie()); parce que la frame en réalité contient un JPanel et si sa méthode paintComponent n'est pas surchargée, il le dessinera vide.
0
Rejoignez-nous