Java : résultat différent sous linux et windows.

Le
Yvon
Bonjour.

J'ai réussi (par erreur) à faire un programme java qui se comporte
différemment sous Linux et Windows XP.

Je travaille sous Linux avec NetBeans, et l'erreur était dans le
constructeur d'un JDialog comportant une JTable et
3 JTextFields (tf_numero, tf_anFabric, tf_chantier).

toute la partie du code, entre super et initcomponent, destinée à récupérer
les valeurs à afficher dans les 3 JTextFields a été éliminée car sans
intérêt ici.

L'intéressant c'est la répétition accidentelle de initComponent() après le
chargement de leur
contenu dans les 3 JTExFields :

++++++++++++++++
/** Creates new form HistoireDialog */
public HistoireDialog(java.awt.Frame parent, boolean modal) {
super(parent, modal);

initComponents(); //méthode crée par NetBeans, qui construit le JDialog
et remplit la JTable

tf_numero.setText(Club101FrView.numCoque.toString());
tf_anFabric.setText(dateConstruc.toString());
tf_chantier.setText(chantier);

initComponents(); //cette ligne est l'erreur : un copier/coller
malencontreux ?
}
+++++++++++++++

Normalement les JTexfields devraient apparaître vides, puisque reconstruits
une seconde fois, sans contenu.

Mais ce n'est pas le cas sous Linux, l'erreur est invisible à la compilation
et à l'exécution, que ce soit sous NetBeans, ou bien en console avec le
fichier .jar et la librairie associée.

Sous Windows XP, l'erreur est visible à l'exécution : les 3 JTextFields
n'ont que leur contenu par défaut ('JTextField').

Il y a sûrement une explication mais elle est enterrée trop profond pour
moi!

--
Yvon
http://perso.numericable.fr/vertgalant/
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Yliur
Le #22780981
Le Thu, 11 Nov 2010 14:11:43 +0100
Yvon
Bonjour.

J'ai réussi (par erreur) à faire un programme java qui se comporte
différemment sous Linux et Windows XP.

Je travaille sous Linux avec NetBeans, et l'erreur était dans le
constructeur d'un JDialog comportant une JTable et
3 JTextFields (tf_numero, tf_anFabric, tf_chantier).

toute la partie du code, entre super et initcomponent, destinée à
récupérer les valeurs à afficher dans les 3 JTextFields a été
éliminée car sans intérêt ici.

L'intéressant c'est la répétition accidentelle de initComponent()
après le chargement de leur
contenu dans les 3 JTExFields :

++++++++++++++++
/** Creates new form HistoireDialog */
public HistoireDialog(java.awt.Frame parent, boolean modal) {
super(parent, modal);

initComponents(); //méthode crée par NetBeans, qui construit le
JDialog et remplit la JTable

tf_numero.setText(Club101FrView.numCoque.toString());
tf_anFabric.setText(dateConstruc.toString());
tf_chantier.setText(chantier);

initComponents(); //cette ligne est l'erreur : un copier/coller
malencontreux ?
}
+++++++++++++++

Normalement les JTexfields devraient apparaître vides, puisque
reconstruits une seconde fois, sans contenu.

Mais ce n'est pas le cas sous Linux, l'erreur est invisible à la
compilation et à l'exécution, que ce soit sous NetBeans, ou bien en
console avec le fichier .jar et la librairie associée.

Sous Windows XP, l'erreur est visible à l'exécution : les 3
JTextFields n'ont que leur contenu par défaut ('JTextField').

Il y a sûrement une explication mais elle est enterrée trop profond
pour moi!




Que fait précisément la méthode initComponents() ? Je suppose qu'elle
initialise notamment les attributs tf_* ? Le code précis pourrait
peut-être t'aider ?

Utilises-tu la même JVM sous Linux et Windows ? Celle de Sun^W Oracle
par exemple ?

Quand on modifie les composants imbriqués dans une fenêtre, un
panneau, ... les nouveaux ne sont pas toujours correctement affichés.
Une méthode permet de redessiner la hiérarchie de composants
correctement. J'avais souvenir d'une méthode updateUITree(), ou quelque
chose du genre, mais je ne trouve qu'une méthode nommée updateUI().
Quelqu'un pourra peut-être confirmer/infirmer.
Testman
Le #23249791
On 11/11/2010 14:11, Yvon wrote:
Bonjour.

J'ai réussi (par erreur) à faire un programme java qui se comporte
différemment sous Linux et Windows XP.

Je travaille sous Linux avec NetBeans, et l'erreur était dans le
constructeur d'un JDialog comportant une JTable et
3 JTextFields (tf_numero, tf_anFabric, tf_chantier).

toute la partie du code, entre super et initcomponent, destinée à récupérer
les valeurs à afficher dans les 3 JTextFields a été éliminée car sans
intérêt ici.

L'intéressant c'est la répétition accidentelle de initComponent() après le
chargement de leur
contenu dans les 3 JTExFields :

++++++++++++++++
/** Creates new form HistoireDialog */
public HistoireDialog(java.awt.Frame parent, boolean modal) {
super(parent, modal);

initComponents(); //méthode crée par NetBeans, qui construit le JDialog
et remplit la JTable

tf_numero.setText(Club101FrView.numCoque.toString());
tf_anFabric.setText(dateConstruc.toString());
tf_chantier.setText(chantier);

initComponents(); //cette ligne est l'erreur : un copier/coller
malencontreux ?
}
+++++++++++++++

Normalement les JTexfields devraient apparaître vides, puisque reconstruits
une seconde fois, sans contenu.

Mais ce n'est pas le cas sous Linux, l'erreur est invisible à la compilation
et à l'exécution, que ce soit sous NetBeans, ou bien en console avec le
fichier .jar et la librairie associée.

Sous Windows XP, l'erreur est visible à l'exécution : les 3 JTextFields
n'ont que leur contenu par défaut ('JTextField').

Il y a sûrement une explication mais elle est enterrée trop profond pour
moi!




Bonjour Yvon,

Interessant :)

Peux-tu nous donner un cas de test complet ?

Car normalement initComponent() est bien réentrant ... sauf s'il bricole
avec un top level et plus particulièrement sur les cycles d'evenements.
Mais j'en doute ...

A+
TM
Yvon Nedon
Le #23251851
Testman wrote:

On 11/11/2010 14:11, Yvon wrote:
Bonjour.

J'ai réussi (par erreur) à faire un programme java qui se comporte
différemment sous Linux et Windows XP.

Je travaille sous Linux avec NetBeans, et l'erreur était dans le
constructeur d'un JDialog comportant une JTable et
3 JTextFields (tf_numero, tf_anFabric, tf_chantier).

toute la partie du code, entre super et initcomponent, destinée à
récupérer les valeurs à afficher dans les 3 JTextFields a été éliminée
car sans intérêt ici.

L'intéressant c'est la répétition accidentelle de initComponent() après
le chargement de leur
contenu dans les 3 JTExFields :

++++++++++++++++
/** Creates new form HistoireDialog */
public HistoireDialog(java.awt.Frame parent, boolean modal) {
super(parent, modal);

initComponents(); //méthode crée par NetBeans, qui construit le
JDialog
et remplit la JTable

tf_numero.setText(Club101FrView.numCoque.toString());
tf_anFabric.setText(dateConstruc.toString());
tf_chantier.setText(chantier);

initComponents(); //cette ligne est l'erreur : un copier/coller
malencontreux ?
}
+++++++++++++++

Normalement les JTexfields devraient apparaître vides, puisque
reconstruits une seconde fois, sans contenu.

Mais ce n'est pas le cas sous Linux, l'erreur est invisible à la
compilation et à l'exécution, que ce soit sous NetBeans, ou bien en
console avec le fichier .jar et la librairie associée.

Sous Windows XP, l'erreur est visible à l'exécution : les 3 JTextFields
n'ont que leur contenu par défaut ('JTextField').

Il y a sûrement une explication mais elle est enterrée trop profond pour
moi!




Bonjour Yvon,

Interessant :)

Peux-tu nous donner un cas de test complet ?

Car normalement initComponent() est bien réentrant ... sauf s'il bricole
avec un top level et plus particulièrement sur les cycles d'evenements.
Mais j'en doute ...

A+
TM



Bonsoir.

Qu'entends tu par un cas de test complet ?

Je suis un amateur autodidacte assez âgé et mes capacités de déboguage se
limitent à l'ajout de nombreux System.out.println().
Mais si vous me donnez des instructions pas trop complexes je devrais
pouvoir les réaliser.
Si ça vous intéresse je peux essayer refaire un programme aussi simple que
possible avec le même comportement.


Je viens de refaire un essai avec l'erreur : un second initComponent()
rajouté après l'initialisation des JTextFields (tf_numero, tf_anFabric,
tf_chantier).

Après compilation par "Clean and Build Main Project", je récupère le contenu
du répertoire "dist" fabriqué par NetBeans (répertoire "lib" et
"fichier.jar") et le copie ailleurs sur la machine linux ainsi que sur le
netBook WindowsXP.

Quand je lance le programme en console sur la machine WindowsXP
(java -jar fichier.jar) l'erreur est visible : les JTextfields contiennent
leur valeur par défaut.

Quand je lance le programme sur la machine Linux, tout marche parfaitement,
comme si la seconde instruction initComponent() était ignorée.

Machine linux OpenSuse 11.4 ; Java 1.6.0.20 ; NetBeans 6.5
Machine Windows XP Familial 2002 ; java 1.6.0.22
--
Yvon
http://perso.numericable.fr/vertgalant/
Publicité
Poster une réponse
Anonyme