# Mise a jour Tiger -> Leopard = Xcode 3 ... ?



## macErmite (2 Mars 2009)

Bonjour,

Après une mise à jour passant de Tiger vers Léopard puis l'installation de Xcode 312, les projets antérieurs ne semblent pas fonctionner. En effet le message suivant apparaît :

" error: can't exec '/Developer/Java/Ant/bin/ant' (No such file or directory) " Après une recherche sur le Finder, je ne remarque pas la présence de Java dans le chemin indiqué. D'ailleurs je ne sais pas ou celui-ci se trouve 

Pouvez-vous m'aider à débloquer Xcode, merci


----------



## tatouille (2 Mars 2009)

tu dois rseconstruire les index des projets


----------



## macErmite (2 Mars 2009)

En quoi cela consiste :mouais: ?


----------



## Didier Guillion (3 Mars 2009)

Essaie un Build>Clean all target.

Cordialement


----------



## macErmite (3 Mars 2009)

Je suppose que cette action est réalisée avec Xcode ? (Oui je ne connais pas grand chose en programmation, j'utilisais Xcode pour créer des utilitaires....)


----------



## tatouille (3 Mars 2009)

macErmite a dit:


> Je suppose que cette action est réalisée avec Xcode ? (Oui je ne connais pas grand chose en programmation, j'utilisais Xcode pour créer des utilitaires....)



ferme xcode,
- mais a la poubelle le dossier build
- ouvre ton .xcodeproj garde seulement projet et vire ton identite

ou alors rebuild code index dans project edit active target premiere tab


----------



## macErmite (3 Mars 2009)

J'ai fini par créer un nouveau projet en y insérant les deux fichiers java. Car malgré vos précieux conseils je n'ai pas réussis l'opération. A présent Xcode me sort beaucoup d'erreurs que je n'avais pas avant. c'est 

Extrait de la console :

*[Session started at 2009-03-03 20:10:36 +0100.]
Picked up _JAVA_OPTIONS: -Xdebug -Xnoagent -Xrunjdwp:transport=dt_local,server=y,address=8000
Listening for transport dt_local at address: 8000
java.io.FileNotFoundException: systemeData04.txt (No such file or directory)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(FileInputStream.java:106)
	at java.io.FileInputStream.<init>(FileInputStream.java:66)
	at DataFileTableModel.initVectors(DataFileTableModel.java:71)
	at DataFileTableModel.<init>(DataFileTableModel.java:54)
	at DataFileTable.<init>(DataFileTable.java:51)
	at DataFileTable.main(DataFileTable.java:83)
Xcode could not locate source file: java/awt/Container.java (line: 1455)
Xcode could not locate source file: java/awt/Container.java (line: 1455)
JavaBug>* 

Fichier : _DataFileTable.java_


```
//
//  DataFileTable.java
//  DataFileTable
//
//  Created by sébastien sibille on 03/03/09.
//  Copyright (c) 2009 __MyCompanyName__. All rights reserved.
//
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import java.util.*;

	//  DataFileTable.java
	//  DataFileTable
	//
	/** Description du code dans un phrase complète.
	 * @author <a href="http://www.le-site.com/">Jean Dupondt</a>
	 * @version 1.0 (2003-01-09)
	 */
		
	/**
	 - Un Jpanel est un contenant(container) de composantes 
	 - On ajoute des composantes à un Jpanel avec add
	 (Un contenant a besoin dun cadre (frame) alors on place un JPanel dans un JFrame)
	 
	 - La notion d'héritage s'implémente en Java avec le mot clé extends
	 
	 
	 - Le composant JTable permet dafficher des tables de données,
	 en permettant éventuellement lédition de ces données.
	 Un JTable ne contient pas ses données mais les obtient à partir 
	 dun tableau dobjets à 2 dimensions, ou à partir dun modèle de données.
	 */
	
	/**
	 Constructeur :
	 
	 On récupère le nom du fichier de données (qui sera déterminé dans la méthode main), 
	 puis on crée le modèle de table et la table. La table est placée dans un JScrollPane 
	 pour obtenir des ascenceurs lorsque c'est nécessaire.
	 */
	
	public class DataFileTable extends JPanel {
		public DataFileTable(String dataFilePath) {
			
			//construction du modèle de remplissage à partir du fichier
			DataFileTableModel model= new DataFileTableModel(dataFilePath);
			
			// on déclare une variable objet, de type Font (police de caractère).
			Font f = new Font("SanSerif",Font.PLAIN,24);
			setFont(f);		//application de la fonte 
			
			//création du tableau
			JTable table = new JTable();							
			table.setPreferredScrollableViewportSize(new Dimension(500, 300));
			table.setModel(model);
			table.createDefaultColumnsFromModel();
			
			add(new JScrollPane(table));
		}
		
		/**
		 Dimensions préférées :
		 La méthode getPreferredSize() permet de fixer les dimensions préférées du tableau.
		 */
		
		public Dimension getPreferredSize(){
			return new Dimension(200,200);
		}
		
		/**
		 Méthode main :La méthode principale permet de récupérer un nom de fichier en paramètre,
		 puis de créer un tableau de type DataFileTable et de l'insérer dans une fenêtre.
		 */
		
		public static void main(String s[]) {
			
			JFrame frame = new JFrame("Données du système");		//la fenêtre du programme
			DataFileTable  pane1 = new DataFileTable("systemeData04.txt");//tableau
			
			//configuration de la fenêtre
			frame.setSize(new Dimension(600,500));//taille de la fenêtre
			frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
			frame.setForeground(Color.black);
			frame.setBackground(Color.lightGray);
			
			frame.getContentPane().add( pane1);
			frame.setVisible(true);										//affichage
			frame.addWindowListener(new WindowCloser());				//écouteur pour fermeture
			
		}
	}
	/**
	 La classe WindowCloser :
	 
	 Il reste à créer la classe WindowCloser chargée de la gestion des évènements liés à la fenêtre.
	 
	 */
	class WindowCloser extends WindowAdapter {
		public void windowClosing(WindowEvent e) {
			Window win = e.getWindow();
			win.setVisible(false);					//effacer la fenêtre
			System.exit(0);							//terminer le programme
		}
	}
```

Fichier : _DataFileTableModel.java_


```
//
//  DataFileTableModel.java
//  DataFileTable
//
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;

/**
La classe DataFileTableModel 

Cette classe dérivée de la classe AbstractTableModel devra implémenter 
un certain nombre de méthodes déclarées abstraites.

Elle utilisera pour ce faire les données contenues dans un fichier.

Déclaration et variables

Nous utiliserons trois variables:

une chaine de caractères contenant le nom du fichier de données
un vecteur contenant les noms de colonnes
un vecteur contenant les données à afficher dans le tableau

La classe Vector permet de créer une collection d'objets qui fonctionne de
la même manière qu'un tableau, à l'exception que sa capacité peut varier en fonction des besoins.
						Vector vecteur = new Vector();
						
Java définit quatre niveaux d'accès pour les variables
d'instances (données membres) et les méthodes :

	public : un élément public est accessible de partout et sans aucune restriction.
Certaines classes (comme la classe principale main) doivent obligatoirement être 
déclarées publiques (pour pouvoir exécuter l'application...)

	protected : un élément protected (protégé) est accessible uniquement
aux classes d'un package et à ses classes filles

	private : un élément private (privé) est accessible uniquement au sein de la
classe dans laquelle il est déclaré. Ces éléments ne peuvent être manipulés
qu'à l'aide de méthode spécifiques appelés accesseur et mutateur						

*/

public class DataFileTableModel extends AbstractTableModel {
  protected Vector data;					//données
  protected Vector columnNames ;				//noms de colonnes
  protected String datafile;					//nom du fichier de données
  
  public DataFileTableModel(String f){
    datafile = f;
    initVectors();  
    }

  public void initVectors() {
    String aLine ;
    data = new Vector();
    columnNames = new Vector();
	
	//L'instruction try... catch désigne un bloc de commandes à essayer et spécifie qu'une
	//réponse doit lancer une exception. Si une exception est lancée, l'instruction try... catch la saisira.
	
    try {
	
	//FileInputStream(File file)
	//crée un objet FileInputStream en ouvrant une connexion à un fichier
	// courant, soit le fichier désigné par l'objet File.
	
      FileInputStream fin =  new FileInputStream(datafile);
	  
	//La classe BufferedReader lit du texte à partir d'un flux d'entrée de caractères,
	//mettant en mémoire tampon les caractères afin de fournir une plus
	//grande efficacité pour la lecture de caractères, de tableaux et de lignes. 
		   
      BufferedReader br = new BufferedReader(new InputStreamReader(fin));
    // extract column names
	  
	//La classe StringTokenizer permet à une application de décomposer
	//une chaîne de caractères en jetons.
	  
      StringTokenizer st1 = new StringTokenizer(br.readLine(), "|");
	//La boucle while contient comme argument une condition d'arrêt toujours évaluée avant chaque itération.
        while(st1.hasMoreTokens())		//vérifie s'il n'y a plus de jetons disponibles à partir de l'objet StringTokenizer.
          columnNames.addElement(st1.nextToken());
    // extract data
	  

      while ((aLine = br.readLine()) != null) {  
        StringTokenizer st2 = 
         new StringTokenizer(aLine, "|");
        while(st2.hasMoreTokens())		
          data.addElement(st2.nextToken());
        }
      br.close();  
      }
    catch (Exception e) {
      e.printStackTrace();
      }
  }
//Nombre de lignes :
//Le nombre de lignes est obtenu en divisant le nombre d'éléments
//du champ data par le nombre de colonnes.

  public int getRowCount() {
    return data.size() / getColumnCount();
    }
//Nombre de colonnes :
//Le nombre de colonnes est le nombre d'éléments du champ columnNmes.

  public int getColumnCount(){
    return columnNames.size();
    }
//Noms des colonnes :
//Les noms des colonnes sont contenus dans le champ columnNames.

  public String getColumnName(int columnIndex) {
    String colName = "";

    if (columnIndex <= getColumnCount())
       colName = (String)columnNames.elementAt(columnIndex);

    return colName;
    }

//Type de contenu d'une colonne
//Dans notre exemple, toutes les données sont des chaînes de caractères, donc de classe String.
    
  public Class getColumnClass(int columnIndex){
    return String.class;
    }
	
//Possibilité d'édition des données
//On indique ici quelles cellules sont modifiables. Dans notre exemple, aucune cellule ne le sera.
    
  public boolean isCellEditable(int rowIndex, int columnIndex) {
    return true;
    }
	
//Contenu d'une cellule :
//On donne ici le contenu de chaque cellule sous forme d'objet. Dans notre exemple,
//ce contenu est une chaîne de caractères contenue dans le champ data. Il faut tenir compte
//du fait que les données sont placées les unes derrière les autres et donc recalculer leur position
//en fonction de la ligne et de la colonne de la cellule.
    
  public Object getValueAt(int rowIndex, int columnIndex) {
    return (String)data.elementAt( (rowIndex * getColumnCount()) + columnIndex);
    }
	
//Changement du contenu d'une cellule :
//On indique ici comment prendre en compte les modifications du contenu des cellules effectuées
//par l'utilisateur. Dans notre exemple, aucune cellule n'est éditable, il n'y a donc rien à faire.

  public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
  data.setElementAt( aValue, (rowIndex*getColumnCount())+columnIndex);
	 
    }
}
```

quelqu'un comprends quelque chose ? 

PS.: Je suis un peut déçu de cette mise à jour ...


----------



## tatouille (3 Mars 2009)

ho il y a aussi une update de java,
ca peut venir de ca et essaye  aussi de te mettre en non-debug/release mode pour voir?


----------



## Lapin Masqué (3 Mars 2009)

A priori il ne trouve pas le fichier que tu cherches à lire à savoir systemeData04.txt

Vérifies qu'en recréant le projet tu n'as pas oublié de le déplacer. Ensuite je ne m'y connais pas trop en programmation java sous XCode mais c'est un problème de classpath : il cherche à charger le fichier à partir d'une position relative à ton projet que XCode fournit au compilateur java.

Essaies de mettre ce fichier dans la racine du projet, ou dans build (mais ce ne sont que des suppositions)

Et si vraiment tu ne trouves pas tu peux toujours renseigner le chemin absolu du fichier ("/Users/.../systemeData04.txt")

---

Si tu t'y connais un peu en java, pour trouver l'endroit où il faut mettre le fichier tu peux tenter d'ajouter cette ligne dans ta fonction main() :


```
try {
File fichierlambda = new File("fichierlambda.txt");
fichierlambda.createFile();
System.out.println(fichierlambda.getCanonicalPath());
} catch (Exception e) {
e.printStacktrace();
}
```


----------



## tatouille (4 Mars 2009)

*Xcode could not locate source file: java/awt/Container.java (line: 1455)*


----------



## macErmite (4 Mars 2009)

Bonjour,

J'ai copié le fichier "systemeData04.txt" dans toute l'arborescence du projet, puis élimination des redondances liées à sa présence dans les répertoires. Cela fonctionne uniquement si ce fichier est copié dans le repertoire *dist* 
(Il y avait : bin, dist,jars,lib,resources et src)

Mais la console affiche ce message :
    [Session started at 2009-03-04 17:17:54 +0100.]
    Picked up _JAVA_OPTIONS: -Xdebug -Xnoagent -  Xrunjdwp:transport=dt_local,server=y,address=8001
   Listening for transport dt_local at address: 8001

Je ne sais pas décortiquer ce charabia :rose:, alors je ne sais pas si le problème est correctement solutionné.


----------



## Lapin Masqué (4 Mars 2009)

Pour le problèmes mis en évidence par tatouille (oui j'avais pas lu), et ce que dit la console :
J'ai trouvé ça.

Mais bon j'ai pas utilisé XCode pour faire du java donc je suis pas plus avancé que toi.


----------

