Dessiner un arbre via un tableau

Résolu/Fermé
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 - 28 nov. 2012 à 08:50
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 13 déc. 2012 à 14:11
Bonjour à tous,

Ayant terminé mon projet sur les arbres, je dois désormais dessiner mon arbre à partir d'un tableau.
Problème : je ne sais même pas comment tracer ne serait-ce qu'une ligne avec Java.

J'ai cherché sur Internet, j'ai lu au moins 3 ou 4 cours différents mais je ne comprends rien, ils parlent de JPanel, de Panneau, de Fenêtre... Il faut combien de classes pour dessiner quelque chose ??!!! Car moi je suis complètement perdu, si quelqu'un pourrait m'expliquer cela serait super sympa.

Merci beaucoup d'avance.

A voir également:

11 réponses

tribun Messages postés 64861 Date d'inscription vendredi 24 août 2007 Statut Membre Dernière intervention 20 février 2020 12 530
28 nov. 2012 à 08:56
Bonjour
Vois ceci si cela peut 'aider amis perso je n'ai jamais essayé

http://docs.google.com/...
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
Modifié par Étienne9 le 3/12/2012 à 09:09
Bonjour à tous

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

public class affarbre
{
public static void affarbre(int tab[])
{
// On crée la fenêtre.
JFrame arbre = new JFrame("Comment dessiner un arbre...");
// On doit pouvoir la fermer en cliquant sur la croix rouge.
arbre.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// On centre la fenêtre
arbre.setLocationRelativeTo(null);
// Pour voir la fenêtre :
arbre.setVisible(true);
arbre.setSize(1024,768);
arbre.setLocationRelativeTo(null);
arbre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

panel.pack();
panel.show();
}
public static void main (String[] args)
{
int[] tab;
tab = new int[5];
tab[1] = 4;
tab[2] = 20;
tab[3] = 15;
tab[4] =67;
affarbre(tab);
}
}


Voilà pour l'instant ce que j'ai fait mais je ne sais pas comment désormais afficher des ronds etc...
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
3 déc. 2012 à 14:14
Déjà, il serait intéressant de donner des coordonnées à chaque noeud de l'arbre complet associé (même si ton arbre n'est pas complet), par exemple numéroter tes feuilles de 2 en 2 sur les X, puis chaque noeud père aurait en X la moyenne des X de ses deux fils. Pour les Y, on prendrait 2 fois la profondeur des noeuds dans l'arbre :

            3,0            

    1,2             5,2    

0,4     2,4     4,4     6,4

Une fois que ça c'est fait il suffit de dessiner les cases de textes au bon endroit :

public static void main(String...args)
{
    JFrame frame = new JFrame("Mon arbre");
    frame.setLayout(null);

    frame.setSize(500,300);
    Dimension dim = frame.getSize();
    
    Arbre a = new Arbre();
    
    // Dimensions de chaque cases en fonction du nombre de cases à dessiner
    int h = a.hauteur();    
    int dw = (dim.width-16)/((int) Math.pow(2,h)*2-1);
    int dh = (dim.height-38)/(2*h+1);
    
    for (Noeud n : a.getNoeuds())
    {
        JLabel label = new JLabel(n.etiquette(),JLabel.CENTER);
        frame.add(label);
        label.setBounds(n.x()*dw,n.y()*dh,dw,dh);
        label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    }
    
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

Évidement les classes Arbre, Noeud, et leurs méthodes, vont dépendre de ce que tu as déjà fait. Pour tester j'ai fait une implémentation bidon qui me donne directement les coordonnées X,Y que je veux.

class Noeud
{
    Noeud(int x,int y,String str)
    {
        this.x=x;
        this.y=y;
        this.str=str;
    }
    
    private int x;
    public int x() { return x; }
    
    private int y;
    public int y() { return y; }
    
    private String str;
    public String etiquette() { return str; }
}

class Arbre
{
    public int hauteur() { return 2; }
    
    public Noeud[] getNoeuds() {
        return new Noeud[] { new Noeud(3,0,"(3,0)"), new Noeud(1,2,"(1,2)"), new Noeud(5,2,"(5,2)"), new Noeud(0,4,"(0,4)"), new Noeud(2,4,"(2,4)"), new Noeud(4,4,"(4,4)"), new Noeud(6,4,"(6,4)") }; 
    }    
}

Remarque : on devrait pouvoir faire plus "joli" en utilisant un GridLayout par exemple, mais aussi bien sûr en rajoutant les lignes entre chaque noeuds...
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
3 déc. 2012 à 20:37
Bonsoir,

En fait j'aimerai comprendre comme dessiner dans ma fenêtre JFrame surtout, le reste je pense que ça ira, en réfléchissant et tout j'y arriverai mais déjà faire un rond je n'y arrive pas...
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
3 déc. 2012 à 21:03
Pour faire ça vraiment bas niveau tu dois surcharger la méthode void paint(Graphics), et utiliser l'objet Graphics pour dessiner, avec les méthodes drawOval(x,y,width,height), drawLine(x1,y1,x2,y2) et drawString(str,x,y) pour ce qui t'intéresse.

Remarque : lorsque tu auras dépassé le stade très scolaire de cet exercice, je t'invite à utiliser GraphStream qui gère graphiquement tout type de graphes (dont les arbres bien sûr).
0

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

Posez votre question
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
Modifié par Étienne9 le 4/12/2012 à 20:22
Dans le code que j'ai fait jusque là, ça donne quoi alors ?
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
4 déc. 2012 à 20:52
Il faudrait changer la structure du code pour avoir une classe qui hérite de JFrame, car il faut que tu redéfinisses la méthode paint pour utiliser l'objet Graphics comme je l'ai expliqué hier.

Mais au niveau de ton tableau, on est encore très loin d'avoir un arbre ! Mais bon, tu as dis qu'une fois la partie "dessin" acquise tu te débrouillerais, alors chaque chose en son temps ;-)

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;

public class AffArbre extends JFrame
{
    private static final long serialVersionUID = 1;
    
    private final int[] tab;
    
    public AffArbre(int...arbre)
    {
        tab = arbre;
        
        setTitle("Comment dessiner un arbre...");
        setSize(400+16,400+38);
        setLocationRelativeTo(null);
        setVisible(true);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        
    }
    
    @Override
    public void paint(Graphics g)
    {
        super.paint(g);
        
        // Utiliser "g" pour dessiner "tab"
        
        // Exemple bidon :
        
        int x1=200, y1=100, // position de la racine
            x2=100, y2=300, // position du fils gauche
            x3=300, y3=300, // position du fils droit
        
        int r=20, d=2*r; // paramètre graphiques (taille des ronds)
        
        g.setColor(Color.BLACK);
        g.drawLine(x1, y1, x2, y2);
        g.drawLine(x1, y1, x3, y3);
        
        g.setColor(Color.GRAY);
        g.fillOval(x1-r, y1-r, d, d);
        g.fillOval(x2-r, y2-r, d, d);
        g.fillOval(x3-r, y3-r, d, d);
        
        g.setColor(Color.BLACK);
        g.drawString("1",x1,y1);
        g.drawString("2",x2,y2);
        g.drawString("3",x3,y3);
    }
    
    public static void main (String[] args)
    {
        new AffArbre(4,20,15,67);
    }
}
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
7 déc. 2012 à 17:42
Bonjour,

Il fait quoi exactement ce code ? Et mes lignes pour dessiner je les mets où ?
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
7 déc. 2012 à 17:52
Exécutes le et tu verras bien ce qu'il fait, c'est quand même assez évident !
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
11 déc. 2012 à 16:28
Je me torture mais rien à faire ! Ma binôme et moi on ne comprend rien de rien !!!
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
11 déc. 2012 à 16:36
Autant que je lise dans cette discussion, pour l'instant tu n'as rien fait, à part ouvrir une fenêtre vide, et créer un tableau... On est très loin d'avoir des arbres !

Pourtant quand on regarde mes codes tout est là, il y a des arbres dessinés, des algorithmes, bref tout ce qu'il faut pour y arriver ! Je ne vais pas faire ton projet à ta place non plus...
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
11 déc. 2012 à 17:20
Je ne demande pas que vous me faites à ma place, seulement il y a plein de parties où c'est le brouillard de guerre total...
Exemple : les entiers que AffArbre prend en paramètre qui, qu'on en mette 1 ou 50 ça ne change rien...
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
11 déc. 2012 à 17:29
Ça ne change rien parce que je n'ai pas utilisé le tableau "tab" ça c'est à toi de le faire, moi je me suis contenté d'un exemple bidon, d'ailleurs c'est marqué dans le code :

public void paint(Graphics g)
{
    super.paint(g);
        
    // Utiliser "g" pour dessiner "tab"
        
    // Exemple bidon :

Il faut que tu regardes comment fonctionne mon exemple bidon pour faire la même chose avec "tab".
Mon exemple utilises 3 valeurs, mais toi ça va dépendre de ce que tu mets dans le tableau !
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
11 déc. 2012 à 17:47
Bonjour,

J'ai repris votre algorithme et voilà ce que j'ai fait pour l'instant. Je dois partir, je continuerai plus tard (autre jour ou....)

import java.awt.Color;
import java.awt.Graphics;
import java.lang.Math.*;
import javax.swing.JFrame;

public class affarbre extends JFrame
{
private static final long serialVersionUID = 1;

private final int[] tab;

public affarbre(int...arbre)
{
tab = arbre;
setTitle("Arbre");
setSize(1024,768);
setLocationRelativeTo(null);
setVisible(true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

}
public void paint(Graphics g)
{
super.paint(g);
int hauteur = ((int) Math.log((double) tab.length-1))/((int)Math.log((double) 2));
int nmax=0;
int n=0;
while (hauteur >= 0)
{
nmax = (int) Math.pow(2,hauteur);
n = (int) (((Math.pow(2,hauteur+1)) -1) - ((Math.pow(2,hauteur)) -1));*
// dessin sera ici
hauteur = hauteur-1;
}
}

public static void main (String[] args)
{
new affarbre();
}
}
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
Modifié par Étienne9 le 12/12/2012 à 16:06
Bonjour,

J'ai pas mal avancé mais il y a un problème. Tout marche jusque n =3 mais à n=4 ça cale...
Voilà mon code, si vous pouviez jeter un oeil, merci beaucoup :
  
import java.awt.Color;  
import java.awt.Graphics;  
import java.lang.Math.*;  
import javax.swing.JFrame;  

public class affarbre extends JFrame  
{  
    private static final long serialVersionUID = 1;  
    private final int[] tab;  
    public affarbre(int...arbre)  
    {  
        tab = arbre;  
        setTitle("Arbre");  
        setSize(1024,768);  
        setLocationRelativeTo(null);  
        setVisible(true);  
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);     
    }  
    public void paint(Graphics g)  
    {  
        super.paint(g);  
        int hauteur = (int)(( Math.log((double) tab.length-1))/(Math.log((double) 2)));  
        int n=0;  
        int i=0;  
        int y=0;  
        int indicetab=tab.length-1;  
        int pas=(int) ((1024)/(Math.pow(2,hauteur)+1));  
        int x=pas;  
        int pasprec=0;  
        while (hauteur >= 0)   
        {  
         if (pasprec == 0) {  
          n = (int) (tab.length - Math.pow(2,hauteur));  
         }  
         else {  
          n = (int) Math.pow(2,hauteur);  
         }  
         y = (hauteur+2)*33;  
         if (pasprec != 0) {  
          x = (int) pasprec + (pasprec/2);  
         }  
         indicetab=indicetab-n+1;  
         for (i=1;i<=n;i++) {  
          g.fillOval(x,y,23,23);  
          g.drawString(tab[indicetab] + " ",x,y);  
          indicetab=indicetab+1;  
          x = x+pas;  
         }  
         indicetab = indicetab - n - 1;  
         pasprec = pas;  
         pas = 2*pas;  
         hauteur = hauteur-1;  
        }  
    }  
    public static void main (String[] args)  
    {  
     int tab[];  
     tab = new int[5];  
     tab[1] = 0;  
     tab[2] = 22;  
     tab[3] = 8;  
     tab[4] = 6;  
     new affarbre(tab);  
    }  
}  
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
12 déc. 2012 à 18:33
Mais où est ton arbre !!? À la limite je me demande même : est-ce que tu sais ce qu'est un arbre ?
Tu ne peux pas manipuler ton tableau directement, il faut que tu mettes les valeurs dans un arbre avant d'envisager de dessiner quoi que ce soit !

public class Arbre
{
    private Noeud noeud;
    private Arbre filsGauche, filsDroit, pere;

    public int hauteur();
    
    public Noeud[] getNoeuds();
}

Remarque : la classe Noeud j'en avais déjà proposé une ici, elle permet de stocker les coordonnées dont tu as besoin pour faire le dessin final, mais il faut passer par l'arbre pour calculer ces coordonnées (par exemple comme je l'avais déjà indiqué ici).

Bref, comme je l'ai dit hier, tu as tout ce qu'il faut dans cette discussion pour faire ce programme, mais il faut prendre la discussion dans son ensemble !
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
12 déc. 2012 à 19:11
J'ai rajouté les lignes entre les noeuds, pour moi construire une structure d'arbre ça ne sert à rien. Je suis persuadé qu'on peut directement construire l'arbre dans construire d'autres structures.
Exécutez-le et vous verrez que ça ressemble presque à un arbre !!

import java.awt.Color;
import java.awt.Graphics;
import java.lang.Math.*;
import javax.swing.JFrame;

public class affarbre extends JFrame
{
    private static final long serialVersionUID = 1;
    private final int[] tab;
    public affarbre(int...arbre)
    {
        tab = arbre;
        setTitle("Arbre");
        setSize(1024,768);
        setLocationRelativeTo(null);
        setVisible(true);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);   
    }
    public void paint(Graphics g)
    {
        super.paint(g);
        int hauteur = (int)(( Math.log((double) tab.length-1))/(Math.log((double) 2)));
        int n=(int) (tab.length - Math.pow(2,hauteur));
        int i=0;
        int y=0;
        int indicetab=tab.length-1;
        int pas=(int) ((1024)/(Math.pow(2,hauteur)+1));
        int x=pas;
        int pasprec=0;
        while (hauteur >= 0) 
        {
        	if (pasprec != 0) {
        		n = (int) Math.pow(2,hauteur);
        		x = (int) (pasprec + (pasprec/2));
        	}
        	y = (hauteur+2)*33;
        	indicetab=indicetab-n+1;
        	for (i=1;i<=n;i++) {
        		g.fillOval(x,y,23,23);
        		// ici
        		if (hauteur > 0) {
        			if ((i % 2) == 0) {
        				g.drawLine(x,y,(int)(x-(pas/2)),y-33);
        			} 
        			else {
        				g.drawLine(x,y,(int)(x+(pas/2)),y-33);
        			}
        		}
        		// ici
        		g.drawString(tab[indicetab] + " ",x,y);
        		indicetab=indicetab+1;
        		x = x+pas;
        	}
        	indicetab = indicetab-n-1;
        	pasprec = pas;
        	pas = 2*pas;
        	hauteur = hauteur-1;
        }
    }
    public static void main (String[] args)
    {
     int tab[];
     tab = new int[10];
     tab[1] = 0;
     tab[2] = 22;
     tab[3] = 8;
     tab[4] = 6;
     tab[5] = 12;
     tab[6] = 9;
     tab[7] = 54;
     tab[8] = 100;
     tab[9] = 456;
     new affarbre(tab);
    }
}
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
12 déc. 2012 à 19:26
"ça ressemble presque à un arbre", c'est vrai qu'on est vaguement sur le bon chemin, même si ce n'est pas encore très esthétique, ce n'est plus qu'une question de réglages...

Quelques remarques sur tes tableaux : la case 0 n'est ni initialisée, ni affichée dans l'arbre, c'est surprenant !

De plus il est inutile de remplir ton tableau case par case, tu peux faire directement ceci :

public static void main(String[] args)
{
    int tab[] = { 0, 22, 8, 6, 12, 9, 54, 100 ,456};
    new affarbre(tab);
}

Ou encore plus simple, grâce au point de suspensions dans le constructeur, tu peux faire ceci :

public static void main(String[] args)
{
    new affarbre(0, 22, 8, 6, 12, 9, 54, 100 ,456);
}
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
Modifié par Étienne9 le 12/12/2012 à 19:41
Je vais me laver. Écoutez, j'ai trouvé d'où vient le problème, en fait pasprec contient l'espace entre deux noeuds de la hauteur juste en dessous.

Le soucis c'est que plus bas je fais pas = 2*pas, en fait si vous voulez c'est bon mais le soucis c'est qu'en montant dans l'arbre plus ça va et plus l'écart entre deux noeud est différent des bords...
Je vais réfléchir en prenant ma douche mais je pense qu'il va juste me falloir une variable supplémentaire pour traiter le bord gauche c'est tout au lieu d'utiliser pasprec.

Pour ce qui est de la case 0, c'est l'enseignant qui nous a dit de ne pas l'utiliser car avant l'affichage on fait le tri par tas et que pour trouver le père d'un noeud du tableau on fait i/2 et pour les fils c'est 2i et 2i+1 et cela ne marche pas si on commence à 0.
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
Modifié par Étienne9 le 12/12/2012 à 20:41
j'ai réussi à corriger le problème, c'est 100fois mieux.
Admirez le chef d'oeuvre :)
Les légers problèmes viennent du fait qu'à chaque fois on caste en INT je pense.

import java.awt.Color; 
import java.awt.Graphics; 
import java.lang.Math.*; 
import javax.swing.JFrame; 

public class affarbre extends JFrame 
{ 
    private static final long serialVersionUID = 1; 
    private final int[] tab; 
    public affarbre(int...arbre) 
    { 
        tab = arbre; 
        setTitle("Arbre"); 
        setSize(1024,768); 
        setLocationRelativeTo(null); 
        setVisible(true); 
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);    
    } 
    public void paint(Graphics g) 
    { 
        super.paint(g); 
        int hauteur = (int)(( Math.log((double) tab.length-1))/(Math.log((double) 2))); 
        int n=(int) (tab.length - Math.pow(2,hauteur)); 
        int i=0; 
        int y=0; 
        int indicetab=tab.length-1; 
        int pas=(int) ((1024)/(Math.pow(2,hauteur)+1)); 
        int x=pas; 
        int pasprec=0; 
        int bordgauche=pas; 
        while (hauteur >= 0)  
        { 
         if (pasprec != 0) { 
          n = (int) Math.pow(2,hauteur); 
          x = bordgauche; 
         } 
         y = (hauteur+2)*33; 
         indicetab=indicetab-n+1; 
         for (i=1;i<=n;i++) { 
          g.fillOval(x,y,23,23); 
          if (hauteur > 0) { 
           if ((i % 2) == 0) { 
            g.drawLine(x,y,(int)(x-(pas/2)),y-33); 
           }  
           else { 
            g.drawLine(x,y,(int)(x+(pas/2)),y-33); 
           } 
          } 
          g.drawString(tab[indicetab] + " ",x,y); 
          indicetab=indicetab+1; 
          x = x+pas; 
         } 
         indicetab = indicetab-n-1; 
         pasprec = pas; 
         pas = 2*pas; 
         bordgauche = (int) (bordgauche+(pasprec/2));// !!!!!!!!!!! 
         hauteur = hauteur-1; 
        } 
    } 
    public static void main (String[] args) 
    { 
     new affarbre(0,0,22,8,6,12,9,54,100,456); 
    } 
} 
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
13 déc. 2012 à 07:17
Bonjour,

Désolé pour ce troisième message, j'ai agrandi l'arbre pour voir jusque où je peux afficher et SURTOUT j'ai corrigé les défauts sur les noeuds et le texte... À mon avis je ne peux pas faire mieux.

J'ai réussi à faire mon algorithme que j'avais en tête grâce à vous, merci beaucoup ! Pour ceux que ça intéresse, mon algorithme final (merci de ne pas pomper si c'est un exercice ou un projet à faire) :

import java.awt.Color;
import java.awt.Graphics;
import java.lang.Math.*;
import javax.swing.JFrame;

public class affarbre extends JFrame
{
    private static final long serialVersionUID = 1;
    private final int[] tab;
    public affarbre(int...arbre)
    {
        tab = arbre;
        setTitle("Arbre");
        setSize(1024,768);
        setLocationRelativeTo(null);
        setVisible(true);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);   
    }
    public void paint(Graphics g)
    {
        super.paint(g);
        int hauteur = (int)(( Math.log((double) tab.length-1))/(Math.log((double) 2)));
        int n=(int) (tab.length - Math.pow(2,hauteur));
        int i=0;
        int y=0;
        int indicetab=tab.length-1;
        int pas=(int) ((1024)/(Math.pow(2,hauteur)+1));
        int x=pas;
        int pasprec=0;
        int bordgauche=pas;
        while (hauteur >= 0) 
        {
        	if (pasprec != 0) {
        		n = (int) Math.pow(2,hauteur);
        		x = bordgauche;
        	}
        	y = (hauteur+2)*33;
        	indicetab=indicetab-n+1;
        	for (i=1;i<=n;i++) {
        		g.fillOval(x-11,y-7,23,23);
        		if (hauteur > 0) {
        			if ((i % 2) == 0) {
        				g.drawLine(x,y,(int)(x-(pas/2)),y-33);
        			} 
        			else {
        				g.drawLine(x,y,(int)(x+(pas/2)),y-33);
        			}
        		}
        		g.drawString(tab[indicetab] + " ",x,y-7);
        		indicetab=indicetab+1;
        		x = x+pas;
        	}
        	indicetab = indicetab-n-1;
        	pasprec = pas;
        	pas = 2*pas;
        	bordgauche = (int) (bordgauche+(pasprec/2));
        	hauteur = hauteur-1;
        }
    }
    public static void main (String[] args)
    {
     new affarbre(0,0,22,8,6,12,9,54,100,456,40,52,79,75,65,24,13,16,19,10,14,15,85,95,64,78,54,40,1,2,4,5,6,8,9,7,5,5,4,6,9,56,40,75,45,85,9,8,7,5,41,6,8,5,45,6,45,65,2,5,9,8,7,56);
    }
}
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
13 déc. 2012 à 14:11
"pour voir jusque où je peux afficher", pour ça c'est facile, il suffit de donner un tableau vide de grande taille et regarder le résultat :

public static void main (String[] args)
{
    new affarbre(new int[512]);
}

Une amélioration évidente de ton code serait de pouvoir prendre en compte n'importe quelle taille d'arbre et d'avoir un affichage correct malgré tout, par exemple avec un système de zoom et/ou en dessinant ton arbre dans une fenêtre avec des barres de défilement...

À voir (pour approfondir) : How To Use Sliders, et How To Use Scroll Panes
0