Gonzague

Tak suka wanita gemuk ! le blog de Gonzague.

Intégrer une application Java à Mac OS X

Ces jours-ci je bosse sur une application qui qui doit être développée rapidement (donc pas le temps d’apprendre cocoa/obj-c) et qui ne sera utilisée que sur Mac OS  pour la boite que je suis en train de monter d’ailleurs, je reparlerais de la boite plus tard, je pense que ça intéressera certains d’entre vous.

Histoire de me faire un peu plaisir pour satisfaire mon amour dévoué à Mac OS X je me suis dis que j’allais essayer de bien intégrer l’application à Mac OS. Le problème c’est qu’il faut chercher un peu partout sur le net et c’est pas tout le temps super clair. Donc je vais regrouper tout ça ici ou au moins ce que j’ai utilisé. Car mine de rien, il y a tout un tas de petites choses qui font qu’on aime une application Mac OS.

Je vais divisé cet article en deux parties, ce qu’on peut faire pendant le développement et ensuite ce qu’on peut faire une fois le développement fini.

1) Développement

Ok, alors les habitués de Mac OS auront sûrement remarqué que par exemple les raccourcis de base sont en général tous les même quelque soit les applications tel que cmd + , pour les préférences ou le fameux cmd + q.

Également le fait de pouvoir dropper un fichier sur l’icône du Dock ou encore les notifications Growl. Tout ça c’est possible avec Java !

1.1) Le MacHandler

Bon, j’appelle ça le MacHandler, c’est pas le nom officiel. Il s’agit  d’une classe avec laquelle on va utiliser tous les événements spécifiques à Mac OS , ce qui se passe lorsqu’un fichier est lâché sur le Dock (j’y reviendrais dans la seconde partie  du dossier car il y a d’autres petits trucs à faire), lorsque les préférences sont ouvertes, lorsqu’on clique sur l’icône du dock alors que l’application est déjà lancée etc…

Je me permets un vieux copié collé de ce que j’ai déjà fait car le nom des méthodes est relativement explicite:

public class MacHandler {

public MacHandler() {
// create an instance of the mac osx Application class
Application theApplication = new Application();

// create an instance of our DockBarAdapter class (see source code below)
DockBarAdapter dockBarAdapter = new DockBarAdapter(this);
theApplication.setEnabledPreferencesMenu(true);

// add our adapter as a listener on the application object
theApplication.addApplicationListener(dockBarAdapter);

}

// our "callback" method. this method is called by the DockBarAdapter
// when a "handleOpenFile" event is received.
public void handleOpenFileEvent(ApplicationEvent e) {

}

public void handleQuit(ApplicationEvent e) {
System.exit(0);
}

public void handleReOpenApplication(ApplicationEvent e) {

}

public void handlePreferences(ApplicationEvent e){

}
}

/**
* Extend the Mac OS X ApplicationAdapter class, and just implement the
* handleOpenFile() method so we can handle drag and drop events.
*/
class DockBarAdapter extends ApplicationAdapter {

private MacHandler handler;
// the main class passes a reference to itself to us when we are constructed

public DockBarAdapter(MacHandler handler) {
this.handler = handler;
}

// this is the method that is called when a drag and drop event is received
// by the Application, and passed to us. In turn, we call back to the main
// class to let it know this event was received so it can deal with the
// event.
@Override
public void handleOpenFile(ApplicationEvent e) {
handler.handleOpenFileEvent(e);
}

@Override
public void handleQuit(ApplicationEvent e) {
handler.handleQuit(e);
}

@Override
public void handleReOpenApplication(ApplicationEvent e) {
handler.handleReOpenApplication(e);
}

@Override
public void handlePreferences(ApplicationEvent e) {

handler.handlePreferences(e);
}
}

1.2) Growl

Tout utilisateur de Mac trouvera les notifications fort pratique et en général est content lorsqu’une application les utilise. Ici c’est du 100% fait maison avec une méthode un peu bourrine… Mais qui marche.

Le fonctionnement est relativement simple, on a un fichier AppleScript (.scpt) inclus dans le .jar et une classe qui lors de sa construction extrairera ce script dans un dossier temporaire e l’éxecutera  au besoin

La classe ressemble à ça:

public class GrowlNotification extends Growl {

File file;

public GrowlNotification(){
//lorsque on initialise les notifications, on extrait un fichier applescript du .jar et on l'execute quand on en a besoin.
try {
URL script = getClass().getResource("/applescript/notification.scpt");
script.openStream();

//model.Model.tmpDir est un dossier de fichier temporaires lors de l'execution de mon appli à définir vous même
File f = new File(model.Model.tmpDir+"/notification.scpt");
f.createNewFile();
Tools.copyCompletely(script.openStream(), new FileOutputStream(f)); //ici est une methode pour extraire un fichier du package
file = f;
file.deleteOnExit(); //on supprime le fichier quand on ferme l'appli
} catch (IOException ex) {
Logger.getLogger(GrowlNotification.class.getName()).log(Level.SEVERE, null, ex);
}
}

public void showNotification(String message, String title) {
try {
String[] cmd = new String[4];

cmd[0] = “osascript”;
cmd[1] = file.getPath();
cmd[2] = title;
cmd[3] = message;

Process proc = Runtime.getRuntime().exec(cmd);
} catch (IOException ex) {
Logger.getLogger(GrowlNotification.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

1.3) L’interface

Je trouve que c’est ce qui manque le plus à java sur Mac, c’est très (trop) basique, heureusement qu’il y a un petit génie qui a créé tout ce dont on a besoin ! Ce mec nous a donc pondue une librairie qui regroupe presque tout ce dont on peut avoir besoin !

C’est disponible ici : Mac Widgets for Java et ça permet de faire des choses dans ce genre:

mac widgets blog wefrag mac widgets blog wefrag mac widgets blog wefrag mac widgets blog wefrag mac widgets blog wefrag mac widgets blog wefrag mac widgets blog wefrag mac widgets blog wefrag

Mais ce petit gars ne s’est pas arrêté là sinon ça aurait été trop simple, en fouillant sur son blog super intéressant on tombe sur d’autres trucs pour pousser encore plus l’intégration tels que:

faire des barre de header à la iTunes , faire des listes au look Apple bref que du bon.

D’ailleurs pour la petite histoire ce mec à été engagé par Apple.

En parlant d’Apple ils fournissent quand même un peu d’aide à cette adresse (où il y a un exemple pour les applescripts beaucoup moins bourrin que moi)

1.4) Les system properties

il existe tout un tas de system properties qui permettent de créer des éléments d’interface qui permettent d’éviter quelques sueurs sur des trucs cons. Ca se trouve ici.

En bref, des boutons (plein), des champs de recherches, la décoration des fenêtres, des dropdown etc etc y en a pour tout le monde. C’est très facile à mettre en place et c’est du plus bel effet.

Bon, je comptais pas faire ce dossier en deux parties, mais là il est un peu tard et je me lève tôt demain donc tout ce qui se passe une fois qu’on a fini l’application arrive demain  presque sans fautes !

Intégrer une application Java à Mac OS X (suite)

8 commentaires pour “Intégrer une application Java à Mac OS X”

  1. Sky dit :

    explodingpixels est vraiment intéressant, j’avais déjà eu l’occasion de regarder, d’ailleurs ses sources permettent de comprendre un peu le mieux la création de composants personnalisés en Java.

    Par contre, faire du Java pour n’être utilisé que sur un seul OS, c’est un peu dommage même si on gagne en rapidité de développement.

  2. Monsieur_Paul dit :

    Si je comprends bien tu veux faire une appli java avec le look’n'feel de Mac OS X. Pour reprendre ce que dit Sky, tu risque de perdre un avantage de Java (multi-plateforme) sans vraiment gagner l’avantage de Mac OS X (Cocoa).

    Est-ce que ce ne serait pas possible d’encapsuler ton Java dans Cocoa ? Voir d’utiliser Python ? Quand tu connais déjà la POO, est-ce que c’est si dur que ça de se mettre à Objective C /Cocoa ? (Question sincère, je suis passé directement de scripts Perl sous notepad++ à Xcode/Objective-C/Cocoa et j’en chie…)

  3. Gonzague dit :

    En fait si j’ai choisi java c’est d’une parceque je dois faire l’appli aussi vite que possible car j’ai encore deux sites web à faire dont un assez important, de deux c’est que l’appli sera peut être amenée à être utilisée sur pc car si la boite marche bien il va falloir employer et je ne vais pas payer un mac à tout le monde. Pour l’instant on est deux et deux sur mac.

    Si j’avais le temps je me mettrais à l’obj-c sachant que j’ai deja des bases en C et en smalltalk… mais j’ai aussi mon taff à plein temps (40h++) donc j’essaie de faire de mon mieux pour être efficace le plus rapidement possible.

    Mon niveau actuel en java me permet de sortir quelque chose de fonctionnel et pas trop bugué plutôt rapidement (comparé au temps que FTPix m’a pris… et surtout quand on voit la gueule du code, Sky peut temoigner)

  4. Monsieur_Paul dit :

    Ok.

    En revanche, si tu comptes employer du monde, la différence de coût Mac/Pc sera dérisoire dans tes charges.

  5. Gonzague dit :

    Ma boite ne sera pas basée en France. Mais à Hong Kong et offshore, je vais rester vivre en Malaisie. Donc c’est un peu different. Si je lache 500€ dans un pc et 1000€ pour un mac, la diff est bien là. Charges ou pas. Enfin ça j’ai le temps de le voir venir d’ici à ce qu’on embauche…

  6. divide dit :

    A terme si tu continue le développement multiplateforme je te conseille de te pencher sur Qt, une fois assimilé le principe tu peux développer des applis vraiment très rapidement, et au final t’as du vrai code C++ compilé avec le look natif de ta plateforme. L’éditeur fourni (Qt Creator) facilite vraiment le boulot (compilation, doc, tutos, autocompletion, editeur graphique…) et il est également multiplateforme.

  7. Gonzague dit :

    Va vraiment falloir que je me penche sur du natif un de ces quatres… Tellement de choses a apprendre et seulement 24heures dans une journee.

  8. Aristo dit :

    divide a dit :
    A terme si tu continue le développement multiplateforme je te conseille de te pencher sur Qt, une fois assimilé le principe tu peux développer des applis vraiment très rapidement, et au final t’as du vrai code C++ compilé avec le look natif de ta plateforme. L’éditeur fourni (Qt Creator) facilite vraiment le boulot (compilation, doc, tutos, autocompletion, editeur graphique…) et il est également multiplateforme.

    Qt est multi language, il existe peut-être une version java.

Laisser un commentaire

Si vous avez un compte sur WeFrag, connectez-vous pour publier un commentaire.

Vous pouvez, entre autres, utiliser les tags XHTML suivant :
<a href="" title="">...</a>,<b>...</b>,<blockquote cite="">...</blockquote>,<code>...</code>,<i>...</i>