Importer une "class" en Java

Résolu/Fermé
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 - 13 déc. 2012 à 14:03
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 24 déc. 2012 à 09:24
Bonjour à tous,

J'ai un code tas.java et un autre affarbre.java, affarbre permet de m'afficher un arbre et tas.java permet de faire le tri par tas. Tous les deux sont dans le même dossier, comment puis-je lancer l'affichage depuis tas.java ?

Cordialement et merci beaucoup d'avance.



A voir également:

7 réponses

É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 à 15:40
J'ai fait affarbre(tab);
Il dit qu'il ne connait pas...
1
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
13 déc. 2012 à 15:49
Si tu l'as écrit comme ça c'est normal, le compilateur pense que c'est une méthode (qui n'existe pas), ça ne se voit pas ici car tu ne respectes pas les conventions de nommages, mais c'est un constructeur de classe il faut donc rajouter un new devant :

new affarbre(tab);
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
13 déc. 2012 à 15:17
En fait il n'y a quasiment rien à faire.

Dans ton main de Tas.java tu n'as qu'à appeler AffArbre, comme ils sont dans le même dossier le compilateur va chercher et trouver AffArbre.java et compiler tes deux classes en même temps.
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
14 déc. 2012 à 14:03
Merci beaucoup.

Par contre si je veux voir l'évolution de mon arbre, comment je fais ? Car ça m'ouvre 50 fenêtres et elles sont toutes pareilles.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
14 déc. 2012 à 14:16
Il faudrait que tu modifies l'affichage de l'arbre directement dans la première fenêtre. Si je reprends ton dernier code, il faut juste enlever l'attribut final de tab et rajouter une toute petite méthode :

private int[] tab;

public void setTab(int...val)
{
    tab = val;
    repaint();
}

public static void main (String[] args)
{
    affarbre aff = new affarbre(0,1,2,3);
    
    aff.setTab(0,1,2,3,4,5,6);
}
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
14 déc. 2012 à 14:28
Merci beaucoup ;)

À quoi sert le private static final long serialVersionUID = 1; s'il vous plaît ?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
14 déc. 2012 à 14:53
La classe Component implémente l'interface Serializable, donc toutes les classes qui en héritent (et en particulier JFrame, et donc affarbre) doivent l'implémenter aussi.
Il est donc nécessaire d'avoir un identifiant unique de version de sérialisation (serial version UID) qui permet de détecter les conflits lors de la désérialisation.

Mais tout ça tu ne t'en sers pas, donc tu peux mettre ce que tu veux comme valeur (1 par exemple), tu pourrais même ne pas le mettre à la limite, mais ça va t'afficher un avertissement à la compilation.

Plus d'information dans la documentation de l'interface : java.io.Serializable
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
14 déc. 2012 à 15:03
Comment je peux m'en servir ?

Comment puis-je "endormir le processus" en Java ?
Apparemment il y a WAIT et SLEEP mais ça ne marche pas.

Merci.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
14 déc. 2012 à 15:16
"Comment je peux m'en servir ?"
La sérialisation ce n'est pas une mince affaire, il s'agit en fait de pouvoir enregistrer un objet dans un fichier ou tout autre support binaire et de pouvoir le recharger ultérieurement (éventuellement par un autre programme), ça peut donc servir de sauvegarde, mais aussi de partage d'objets. Mais je ne vois pas du tout l'intérêt de t'en servir pour ton problème. Voir aussi : La sérialisation

"Comment puis-je "endormir le processus" en Java ?"
Il faut regarder du côté des classes java.lang.Thread, ou peut-être java.util.concurrent.Semaphore selon ce que tu veux faire, mais il faudrait être plus précis sur ce que tu veux "endormir", car si c'est la JFrame que tu bloques, l'affichage ne pourra plus être actualisé.
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
14 déc. 2012 à 19:19
En fait je veux afficher l'évolution de l'arbre avec le tri par tas mais ça va trop vite à l'affichage...
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
14 déc. 2012 à 19:29
Dans ce cas tu peux faire une pause dans la méthode setTab, ce qui n'arrêtera pas le thread de ta fenêtre d'affichage, mais fera patienter ton algorithme de tri :

public void setTab(int...val)
{
    tab = val;
    repaint();

    try { Thread.sleep(500); } catch (InterruptedException e) { }
}

Remarque : le temps est en millisecondes, donc ici j'ai mis 0.5 seconde d'attente.
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
14 déc. 2012 à 20:33
Merci beaucoup.
Par contre aff.arbre(tab); ne marche pas et j'ai même essayé affarbre.setTab(tab);
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
14 déc. 2012 à 20:41
Et si tu faisais ce que j'ai mis : aff.setTab(tab);
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
14 déc. 2012 à 20:45
Même : Cannot find the symbol. Ça pointe sur la 'a' de aff.
Symbol : variable aff
Location : class tas
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
14 déc. 2012 à 20:52
Il faut que tu adaptes à ton code, moi j'ai repris le main de tout à l'heure :

public static void main (String[] args)
{
    affarbre aff = new affarbre(0,1,2,3);
    
    aff.setTab(0,1,2,3,4,5,6);
}

Je ne sais pas comment tu as appelé ton objet, mais dans tous les cas tu ne peux pas faire aff.arbre(tab); car la méthode arbre n'existe pas, ni affarbre.setTab(tab); car la méthode setTab n'est pas static...
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
14 déc. 2012 à 21:17
Merci beaucoup, ça marche :D
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
14 déc. 2012 à 21:38
J'ai un petit soucis, à un moment donné j'ai ça dans mon code :

tab = construiretas(tab,indiceFin);
for(i=1;i<=indiceFin;i++)
{
System.out.print(tab[i] + " ");
}
System.out.println("");
System.out.println("Lancement du tri par tas dans 10 secondes...");
System.out.println("Veuillez patienter. Merci.");



Problème : Que je mette System.out.println(""); ou System.out.print('\n'); il ne veut pas me laisser une ligne vide pour aérer...
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
18 déc. 2012 à 17:31
Bonsoir KX,

Voilà ce que j'ai fait mais j'ai des soucis à la compilation :


import java.util.Scanner;

public class tas
{
	public static affarbre aff = new affarbre();
	public static int[] entasser(int tab[], int ip, int indiceFin) // ip pour indice père
	{
		int ifg; // indice fils gauche
		int ifd; // indice fils droit
		int inter; // entier intermédiaire pour échanger éventuellement deux valeurs
		int max=ip; // indice du plus grand noeud, au début on suppose que c'est le père
		if ((ip >= 1) && (ip <= indiceFin)) // l'indice du pèe p doit impérativement appartenir au tableau
			{
				ifg=2*ip;
				ifd=2*ip+1;
				if (ifg > indiceFin) // si pas de fils gauche, alors il ne peut pas y avoir de fils droit donc on est sur une feuille
				{
					return tab; // fin de la récursivité, on retourne le tableau
				}
				if (ifd > indiceFin) // si on est en dessous, il y a nécessairement un fils gauche donc il faut tester le fils droit
				{ // seul le fils gauche est présent :
					if (tab[ifg] > tab[ip]) // si l'indice fils gauche est plus grand il va falloir le faire remonter
					{ // il faut faire monter le fils gauche et descendre le père
						inter=tab[ip];
						tab[ip]=tab[ifg];
						tab[ifg]=inter;						
						// comme il n'y a que le fils gauche, la récursivitïé s'arrête là et il est inutile d'enregistrer dans max l'indice du plus grand
						return tab;
					}
					// tout va bien, le père est plus grand que le fils gauche, on renvoie juste le tableau et pas besoin d'enregistrer l'indice du plus grand dans max.
					return tab;
				} // les deux fils sont présents :
				if (tab[ifg] > tab[ifd])
				{
					max=ifg;
				}
				else {
					max=ifd;
				}
				// on compare les deux fils et on met l'indice du noeud qui a la plus grande valeur dans max puis on va comparer avec le père.
				if (tab[ip] < tab[max]) 
				{
					inter=tab[ip];
					tab[ip]=tab[max];
					tab[max]=inter;						
					return entasser(tab,max,indiceFin);	
				}
				return tab;
			} // si on est en dessous alors le père n'appartient pas au tableau alors on renvoit le tableau :
			return tab;
	}
	public static int[] construiretas(int tab[],int indiceFin)
	{
		int i;
		for (i=(indiceFin)/2;i>=1;i--) // on appelle entasser du dernier noeud qui n'est pas une feuille jusqu'� la racine.
		{
			entasser(tab,i,indiceFin);
		}
		return tab;
	}
	public static int[] triertas(int tab[],int indiceFin)
	{
		if (indiceFin == 1) {
			return tab; // si l'indice est de 1 ou si la racine est plus grande que le dernier élément alors on arrête.
		}
		int inter;
		inter=tab[1];
		tab[1]=tab[indiceFin];
		tab[indiceFin]=inter;
		entasser(tab,1,indiceFin-1);
		aff.setTab(tab);
		changertaille(indiceFin+1);
		return triertas(tab,indiceFin-1); // sinon on recommence en décrémentant la taille.
	}
	public static void main(String args[])
	{
		int tab[];
		int i;
		int indiceFin;
		System.out.print('\n');
		System.out.println("Nombre de noeuds de l'arbre ?");
		System.out.println("AVERTISSEMENT : POUR UN AFFICHAGE OPTIMAL, NE PAS METTRE PLUS DE 53 NOEUDS");
		indiceFin = (new Scanner(System.in)).nextInt();
		tab = new int[indiceFin+1];
		for(i=1;i<=indiceFin;i++)
		{ // On saisie toutes les valeurs et on remplit.
			System.out.println("Noeud num " + i);
			tab[i]=(new Scanner(System.in)).nextInt();
		}
		System.out.print('\n');
		System.out.print('\n');
		System.out.println("TRI AVEC CONSTRUIRE-TAS :");
		tab = construiretas(tab,indiceFin);
		for(i=1;i<=indiceFin;i++)
		{
			System.out.print(tab[i] + " ");
		}
		aff.setTab(tab);
		System.out.print('\n');
		System.out.print('\n');
		System.out.println("Lancement du tri par tas dans 10 secondes...");
		System.out.println("Veuillez patienter. Merci.");
		System.out.print('\n');
		try { Thread.sleep(10000); } catch (InterruptedException e) { }
		System.out.println("TRI PAR TAS :");
		tab = triertas(tab,indiceFin); // on exécute construiretas et on inverse tab[A] avec tab[indiceFin].
		changertaille(tab.length);
		aff.setTab(tab);
		for(i=1;i<=indiceFin;i++)
		{
			System.out.print(tab[i] + " ");
		}
		System.out.print('\n');
		try { Thread.sleep(10000); } catch (InterruptedException e) { }
	}
}


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 int[] tab; // le tableau pour dessiner l'arbre
    public int taille = tab.length;
    public void changertaille(int nouvelletaille)
    {
    	    taille=nouvelletaille;
    }
    public void setTab(int...val) // cette petite fonction permet de mettre à jour l'arbre, on change le tableau et on dessine à nouveau
    {
    	    tab = val;
    	    repaint();
    	    try { Thread.sleep(3000); } catch (InterruptedException e) { } // Temps d'attente pour avoir le temps de voir l'arbre évoluer.
    }
    public affarbre(int...arbre) // création de la fenêtre pour dessiner
    {
        tab = arbre;
        setTitle("Arbre"); // Titre de la fenêtre
        setSize(1024,768); // Taille de la fenêtre
        setLocationRelativeTo(null);
        setVisible(true); // Pour rendre visible la fenêtre.
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // Pour pouvoir fermer la fenêtre.  
    }
    public void paint(Graphics g) // l'algorithme qui dessine un arbre en partant d'un tableau
    {
        super.paint(g);
        int hauteur = (int)(( Math.log((double) taille-1))/(Math.log((double) 2)));
        int n=(int) (taille - Math.pow(2,hauteur)); // Correspond au nombre de noeuds sur la hauteur h.
        int i=0;
        int y=0;
        int indicetab=taille-1;
        int pas=(int) ((1024)/(Math.pow(2,hauteur)+1));
        int x=pas;
        int bordgauche=pas; // Correspond au bord gauche (l'espace entre le bord gauche et le premier noeud)
        while (hauteur >= 0) // on part du bas et on remonte dans la hauteur
        {
        	if (y != 0) { // tout le temps sauf dans le cas où c'est la première fois car pour la hauteur la plus haute on partage l'espace disponible en parties égales
        		n = (int) Math.pow(2,hauteur); // Nombre de noeuds sur la hauteur h.
        		x = bordgauche;
        	}
        	y = (hauteur+2)*33;// on calcule le y par rapport à la hauteur
        	indicetab=indicetab-n+1; // permet de venir sur la première case du tableau qui correpond à la vzleur du premier noeud
        	for (i=1;i<=n;i++) {
        		g.fillOval(x-11,y-7,23,23); // On dessine un noeud
        		if (hauteur > 0) { // Dans toutes les hauteurs sauf la racine on dessine les lignes entre les noeuds
        			if ((i % 2) == 0) {
        				g.drawLine(x,y,(int)(x-(pas/2)),y-33); // i est pair donc la ligne penche à gauche
        			} 
        			else {
        				g.drawLine(x,y,(int)(x+(pas/2)),y-33); // i est impair donc la ligne penche à droite
        			}
        		}
        		g.drawString(tab[indicetab] + "",x,y-7); // On écrit la valeur du noeud, -7 permet d'ajuster correctement l'écriture pour la mettre plus haute sinon elle est cachée par le noeud
        		indicetab=indicetab+1; // On parcout les cases du tableau sur la hauteur donnée
        		x = x+pas; // On n'oublie pas aussi de déplacer les coordonnées x.
        	}
        	indicetab = indicetab-n-1; // On n'oublie pas de mettre l'indicetab en place pour la prochaine hauteur.
        	bordgauche = (int) (bordgauche+(pas/2)); // On augmente le bord.
        	pas = 2*pas; // Le pas suivant sera deux fois plus grand.
        	hauteur = hauteur-1; // On diminue bien sûr la hauteur.
        }
    }
}
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
19 déc. 2012 à 15:55
Tu as des problèmes à la compilation car tu utilises "changertaille" dans la classe "tas" alors qu'il s'agit d'une méthode de la classe "affarbre", tu devrais donc plutôt faire "aff.changertaille"

De plus tu as des problèmes à l'exécution car tu écris (au tout début de affarbre)

private int[] tab; // le tableau pour dessiner l'arbre
public int taille = tab.length;

Mais tu ne peux pas faire "tab.length" avant que "tab" n'ait été initialisé !

private int[] tab;
public int taille;

public void setTab(int...val)
{
    tab = val;
    taille = tab.length;
    ...
}

public affarbre(int...arbre)
{
    tab = arbre;
    taille = tab.length;
    ...
}
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
19 déc. 2012 à 19:55
Salut,

Merci infiniment.
Peux-tu vérifier que tout soit OK dans mon code s'il te plaît ?
Il est accessible ici :
https://pjjoint.malekal.com/files.php?read=20121219_d5y12x12j10k12
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
Modifié par KX le 19/12/2012 à 20:16
Je ne sais pas trop ce que tu devais faire exactement, donc je ne comprends pas trop pourquoi à un moment ton arbre n'a plus le même nombre de noeuds... Mais en tout ça compile et ça s'exécute sans erreur (sauf si on le pousse à la faute bien sûr).

Deux critiques principales : la JFrame s'affiche peut-être un peu trop tôt, il vaudrait mieux qu'elle s'affiche APRES que l'on ait fini d'entrer les noeuds au clavier... Ensuite je trouve ça très long d'attendre 5 secondes pour que le tri s'affiche, puis encore 15 secondes avant que que la JFrame ne s'anime, pour finalement attendre encore 3 secondes entre chaque étape !

Enfin pour tes 53 noeuds maximums, ton message ne donne qu'une seule envie, c'est de tester ce qui se passe au delà, alors qu'on n'en aurait pas forcément eu envie de taper autant de nombre au clavier s'il n'y avait pas eu ce message...
En plus je pense que le maximum se serait plutôt 63 (car tu changes de hauteur), mais en fait ça dépend aussi de la taille de ta fenêtre, si tu la mets en plein écran, tu peux en mettre plus, alors que sur un écran d'ordi portable, on verra mal avec moins de noeuds...
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 24/12/2012 à 09:15
Faut du courage pour taper 53 noeuds....
J'ai corrigé avec une boucle "tant que" pour la limite, c'est 63 d'ailleurs logiquement (sur mon écran).
Mais pour retarder la fenêtre comme elle est en variable globale je ne vois pas comment faire.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
24 déc. 2012 à 09:24
"pour retarder la fenêtre comme elle est en variable globale je ne vois pas comment faire."
Ce n'est pas un problème il s'agit juste de décaler le setVisible.

Dans le constructeur tu as :
setVisible(true); // Pour rendre visible la fenêtre.

Il faudrait enlever cette ligne, et la mettre bien plus tard, dans ton main :

for(i=1;i<=indiceFin;i++)
{
	System.out.print(tab[i] + " ");
}
aff.setTab(tab);
aff.setVisible(true);

Remarque, au lieu d'une variable globale, il serait mieux de faire :

for(i=1;i<=indiceFin;i++)
	System.out.print(tab[i] + " ");
affarbre aff = new affarbre(tab);
aff.setVisible(true);

Dans ce dernier cas, peu importe de déplacer le setVisible puisque la fenêtre n'est pas construite prématurément...
0