Posez votre question Signaler

Importer une "class" en Java [Résolu]

Étienne9 1054Messages postés mardi 1 mars 2011Date d'inscription 10 mai 2015 Dernière intervention - Dernière réponse le 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.
Lire la suite 
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
J'ai fait affarbre(tab);
Il dit qu'il ne connait pas...
KX 11774Messages postés samedi 31 mai 2008Date d'inscription ContributeurStatut 30 juillet 2015 Dernière intervention - 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);
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
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.
KX 11774Messages postés samedi 31 mai 2008Date d'inscription ContributeurStatut 30 juillet 2015 Dernière intervention - 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);
}
Répondre
Étienne9 1054Messages postés mardi 1 mars 2011Date d'inscription 10 mai 2015 Dernière intervention - 14 déc. 2012 à 14:28
Merci beaucoup ;)

À quoi sert le private static final long serialVersionUID = 1; s'il vous plaît ?
Répondre
KX 11774Messages postés samedi 31 mai 2008Date d'inscription ContributeurStatut 30 juillet 2015 Dernière intervention - 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
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
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.
KX 11774Messages postés samedi 31 mai 2008Date d'inscription ContributeurStatut 30 juillet 2015 Dernière intervention - 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é.
Répondre
Étienne9 1054Messages postés mardi 1 mars 2011Date d'inscription 10 mai 2015 Dernière intervention - 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...
Répondre
KX 11774Messages postés samedi 31 mai 2008Date d'inscription ContributeurStatut 30 juillet 2015 Dernière intervention - 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.
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
Merci beaucoup.
Par contre aff.arbre(tab); ne marche pas et j'ai même essayé affarbre.setTab(tab);
Étienne9 1054Messages postés mardi 1 mars 2011Date d'inscription 10 mai 2015 Dernière intervention - 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
Répondre
KX 11774Messages postés samedi 31 mai 2008Date d'inscription ContributeurStatut 30 juillet 2015 Dernière intervention - 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...
Répondre
Étienne9 1054Messages postés mardi 1 mars 2011Date d'inscription 10 mai 2015 Dernière intervention - 14 déc. 2012 à 21:17
Merci beaucoup, ça marche :D
Répondre
Étienne9 1054Messages postés mardi 1 mars 2011Date d'inscription 10 mai 2015 Dernière intervention - 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...
Répondre
KX 11774Messages postés samedi 31 mai 2008Date d'inscription ContributeurStatut 30 juillet 2015 Dernière intervention - 14 déc. 2012 à 21:52
Il faut en mettre deux : le \n qui fini tes print(tab[i]), et le \n qui aère.

System.out.println("\n");
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
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.
        }
    }
}
KX 11774Messages postés samedi 31 mai 2008Date d'inscription ContributeurStatut 30 juillet 2015 Dernière intervention - 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;
    ...
}
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

Merci infiniment.
Peux-tu vérifier que tout soit OK dans mon code s'il te plaît ?
Il est accessible ici :
http://pjjoint.malekal.com/files.php?read=20121219_d5y12x12j10k12
KX 11774Messages postés samedi 31 mai 2008Date d'inscription ContributeurStatut 30 juillet 2015 Dernière intervention - 19 déc. 2012 à 20:13
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...
Répondre
Étienne9 1054Messages postés mardi 1 mars 2011Date d'inscription 10 mai 2015 Dernière intervention - 24 déc. 2012 à 08:55
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.
Répondre
KX 11774Messages postés samedi 31 mai 2008Date d'inscription ContributeurStatut 30 juillet 2015 Dernière intervention - 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...
Répondre
Ajouter un commentaire
Ce document intitulé «  Importer une "class" en Java  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.