Gilliek
22nov/110

Java et les JFileChooser

Java des fois, tu me fais ch*** !

Je bosse actuellement sur un logiciel de traitement d'image en Java ( coming soon ;-) ) ... et j'ai besoin de manipuler des JFileChooser (pour sélectionner des fichiers et des dossiers).  Avant de pester contre ce foutu Swing d'énoncer mon soucis, je vais dire deux mots sur Swing, pour ceux qui ne connaîtraient pas.

Swing est une bibliothèque graphique pour Java. Elle permet donc de créer des interfaces graphiques. Ce qui est pratique, c'est que ça fonctionne sur n'importe quel système d'exploitation, donc pas mal pour du développement multiplateforme. (petit troll : et c'est beaucoup plus confortable à utiliser que C et GTK ... bien que je préfère largement le C à Java).

Revenons à nos moutons. Qu'est-ce qui me fait actuellement ch*** avec JFileChooser ? Et bien la réponse est simple : son implémentation moisie ! C'est un composant très peu personnalisable. Par exemple, si on veut garder uniquement la fenêtre de navigation sans les boutons, le sélectionneur de type de fichiers et toussa, on s'amuse avec la méthode remove(getComponent(index)) à chercher quel est le bon composant à virer. Ou aussi ce qui est à l'origine de ce post : comment choisir le mode d'affichage par défaut (liste ou détails). Je m'attendais à devoir faire un simple setViewMode(JFileChooser.DETAILS), comme en Qt quoi ... mais non faut faire un hack dégueulasse pour arriver à ses fins ! (Rhaaaaaa)

Après quelques énervements, j'ai trouvé un topic sur un forum qui m'a bien aidé :

La solution consiste à utiliser SwingUtils, téléchargeable sur le site : http://tips4java.wordpress.com/2008/11/13/swing-utils/

Il suffit ensuite de mettre le code trouvé sur le topic mentionné précédemment :

JFileChooser fileChooser = new JFileChooser();
AbstractButton button = SwingUtils.getDescendantOfType(AbstractButton.class,
      fileChooser, "Icon", UIManager.getIcon("FileChooser.detailsViewIcon"));
button.doClick();

Et le tour est joué ! Mais je trouve ça vraiment dégueulasse personnellement ...

De manière plus générale, je trouve leur JFileChooser vraiment très pauvre. En plus de ne pas être très confortable à l'utilisation, il n'est pas personnalisable ... c'est vraiment dommage. Il va peut-être falloir que j'en code un moi-même quand j'en aurai le temps ... à suivre ...

 

Edit : Cette solution foire sur Mac OS (ça ne compile pas ...) . De plus, la façon avec laquelle j'ai encore modifié le JFileChooser (avec la méthode remove) fait foirer l'affichage sous Mac OS ...

Edit 2 : J'ai entamé (et déjà bien avancé) le codage de mon propre FileChooser et pour l'instant ça fonctionne bien :-)

20oct/116

Une histoire de modulo …

Tout développeur connait le fameux (le seul, l'unique) : modulo

Comme je suis d'humeur narrative aujourd'hui,  je vais quand même expliquer de quoi il s'agit :-)

Cours du jour, bonjour

Bon, ouvrez bien vos oreilles yeux, on commence.

Tout le monde se souvient de sa tendre enfance, à l'école, en train d'assister à son premier cours de maths sur les divisions. Plutôt que de s'amuser à calculer le résultat réel (au sens mathématique du terme), on ne s'intéressait qu'à la partie entière et au reste.

Petits exemples :

12 / 5 = 2 et Reste = 2

6 / 2 = 3 et Reste = 0

9 / 2 = 4 et Reste = 1

9 / 3 = 3 et Reste = 0

En somme (notez le jeu de mot :-P ), une division entière.

Et bien le modulo calcule le reste. C'est un nom bien barbare, qui au final, n'est rien de plus qu'un calcul enfantin

Donc si on reprend l'exemple ci-dessus, mais en version informatique cette fois, on a :

(dans beaucoup de langage, l'opérateur du modulo est le %)

12 % 5 = 2

6 % 2 = 0

9 % 2 = 1

9 % 3 = 0

Modulo = reste de la division entière.

On utilise vraiment ça ? A quoi ça peut bien servir une telle chose ??

Et bien, c'est très souvent utilisé lorsqu'on programme. On l'utilise, entre autres nombreuses choses, pour déterminer si un nombre est

pair. Il suffit de faire nombre % 2 Si le résultat est null, donc qu'il n'y a pas de reste, alors le nombre est pair. Sinon il est impair.

Maintenant que tout le monde c'est ce qu'est le modulo, on va pouvoir poursuivre sur le sujet de ce post.

Revenons aux choses serieuses

Faisons un petit exercice. Quel est le résultat de :

-5 % 26 = ?

(bien que nous ne soyons pas directement dans post concernant le domaine de la cryptographie, je vais utiliser les deux fameux protagonistes Bob et Alice, parce que je suis tombé sur cette étrangeté pendant un Travail Pratique de cryptographie)

  • Bob : Pff facile, c'est 21 !
  • Alice : Mais, non pas du tout c'est -5 !
  • Bob : Tu n'as rien compris, un modulo c'est cyclique, ça ne peut pas être être négatif !
  • Alice : Rien du tout. Tu es HS  coco !

Mais qui a raison ? Et bien, ils ont tous les deux raisons. Avant d'en venir aux explications, regardons ce qu'en disent les langages de programmation.

Ruby :

$> ruby -e "puts -5 % 26"
21
$>

Python

$> python -c "print(-5 % 26)"
21
$>

Octave (et MATLAB)

$>octave --eval "mod(-5, 26)"
GNU Octave, version 3.4.2
Copyright (C) 2011 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.

Octave was configured for "x86_64-unknown-linux-gnu".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/help-wanted.html

Read http://www.octave.org/bugs.html to learn how to submit bug reports.

For information about changes from previous versions, type `news'.

ans =  21
$>

(On peut voir Bob trépigner :-P )

Java

class Main {
    public static void main(String[] argv) {
        System.out.println("-5 % 26 = " + (-5 % 26));
    }
}
$> javac Main.java
$> java Main
-5 % 26 = -5
$>

PHP

$> php -r 'print((-5 % 26) . "n");'
-5
$>

Agné ?! (le sourire de Bob se fane ... Alice est intriguée, comme on peut s'en douter)

Java et PHP ne sont pas les seuls. C, C++ (et d'autres) retournent -5.

Mais pourquoi ?

Et bien, en réalité, il y a deux définitions du modulo !

Regardons un peu ce qu'en dit notre vieil ami Wikipedia : http://fr.wikipedia.org/wiki/Modulo_(informatique)

Dans l'article, on a les deux définitions :

  1. x mod yxy * floor(xy)
  2. xyxy * iPart(xy)

La première définition donne un modulo cyclique, càd compris entre 0 et le diviseur. Je ne connaissais que la première définission et c'est à cause de ça que je me suis énnervé sur mon Travail Pratique de cryptographie (en Java). Pour résumer, je voulais faire un décalage sur chaque caractère d'une String. Bien entendu, je veux que quand on décale, par exemple, a de -4, on ait w. J'ai donc utilisé un modulo. Et comme j'utilisais le résultat comme indice d'un tableau, j'avais un joli OutOfBoundsExceptions à cause d'un indice négatif. Après quelques tests, j'ai enfin trouvé d'où venait le problème.

C'est donc bon à savoir pour tout développeur :-)

Moralité de l'histoire : Vérifier l'évaluation du modulo du langage utilisé afin de ne pas se faire avoir bêtement (comme moi quoi :-P )

Edit : j'ai mis une liste des langages trié en fonctione de la définition utilisée là : http://blog.gilliek.ch/programmation/modulo-la-suite

8nov/104

Java, c’est fini pour Apple !

Lors de sa dernière Keynote  du 20 octobre intitulée "Back to the Mac", Apple a déclaré avoir abandonné le développement de la machine virtuelle Java pour son nouvel OS nommé Lion. En effet, la société à la pomme maintenait elle-même la version Mac de la JVM.

Mais Apple ne s'arrête pas là, il va même plus loin. Suite au succès de l'AppStore sur les terminaux mobiles, ils ont décidé de faire un AppStore pour Mac OS X. Et bien ce dernier refusera toute application écrite en Java !

Est-ce la fin de Java sur MacOS ?

Pas nécessairement. Il est possible qu'Oracle décide de supporter la JVM pour Mac... Mais s'ils ne le font pas, alors cela mettrait fin au caractère multiplateforme de Java...

J'avoue être deçu par l'attitude d'Apple (déjà que d'habitude je ne les porte pas dans mon coeur, ils ne sont pas prêt de remonter dans mon estime :-P )

27oct/102

Lady Java

Vidéo assez connue sur le Web, mais juste excellente :