mardi 13 novembre 2012

Wake On Lan(WOL) avec Windows 8

Si comme moi le WOL ne fonctionne plus avec Windows 8, bien que vous ayez activé
                                    - la fonction dans votre BIOS : Power -> APM -> Power On by PCI Devices = Enabled

























                                         -modifier les paramètres de la carte réseau :




Sur Windows 8, en désactivant cette fonction dans "Option d'alimentation", le WOL devrait remarcher :


Pour tester, vous pouvez vous rendre à cette adresse :
http://www.depicus.com/wake-on-lan/woli.aspx



jeudi 11 octobre 2012

SwingWorker et mise à jour UI

Lorsque l'on souhaite utiliser SwingWorker afin d'effectuer un traitement mais sans bloquer son interface graphique, on peut être confronter au problème de la communication de son thread de traitement(SwingWorker) vers l'interface graphique.

J'explique :
Ci-dessous notre classe qui étends de SwingWorker
public class MySwingWork extends SwingWorker<Integer, String>
{
    private final Informable informable;

     public MySwingWork (Informable informable)
    {
        this.informable = informable;
    }
    @Override
    protected Integer doInBackground() throws Exception
    {
        /*     WORK   */
        //C'est cette méthode qui mettra à jour le textArea
        publish("test");
        return null;
    }

    @Override
    protected void process(List<String> strings)
    {
        for (String s : strings)
            informable.messageChanged(s);
    }
}

Notre classe avec l'interface graphique :
public class monIHM extends JFrame
{
       public void init()
       {
            /*Initialisation de l'interface graphique*/
            //Text Area qui sera mis à jour pendant le traitement du SwingWorker
            JTextArea textArea=new JTextArea();

            //Interface qui permettra de mettre à jour l'UI en direct avec le swingWorker
            Informable informable = new Informable()
            {
              @Override
              public void messageChanged(String message)
              {
                  final String s = message;
                  Display.getDefault().syncExec(new Runnable()
                  {
                      public void run()
                     {
                        //Modification du TextArea
                        textArea.setText(s);
                    }
                });

            }
           };

           MySwingWork mySwingWork=new MySwingWork(interface);
          
           SwingUtilities.invokeLater(new Runnable()
            {
                  public void run()
                   {
                          /*  Démarrage du SwingWorker. */
                                mySwingWork.execute();
                            }
                     });       
        }
}

Et l'interface qui permet de mettra à jour le composant graphique :
public interface Informable
{
    void messageChanged(String message);
}



C'est la méthode "publish" qui se trouve dans le "doInBackGround" qui permet de mettre à jour le composant graphique.
A noter que dans la méthode "messageChanged" de l'interface "Informable", nous somme obliger d'utiliser ceci :
Display.getDefault().syncExec(new Runnable()
                  {
                      public void run()
                     {
                        //Modification du TextArea
                        textArea.setText(s);
                    }

Si l'on utilise pas ceci, on obtient une erreur AWT-EventQueue-0 thread Invalid thread access, puisque le thread du SwingWorker va essayer d'aller modifier un composant graphique qui est lui-même géré par un autre Thread dont il n'aura pas accès (lien expliquant ce comportement http://www.eclipse.org/swt/faq.php#uithread )

mercredi 22 août 2012

[ECLIPSE] Raccourci clavier


http://www.bugz.fr/wp-content/uploads/2010/11/eclipse_ide_icon.png
 Bonjour,

Voici une liste de raccourci clavier bien pratique sous Eclipse :
  • CTRL+ESPACE : Complétion.
  • F3 ou CTRL+Clic : Afficher la déclaration (classes, variables, méthodes…).
  • ALT+MAJ+J : Ajout d'un commentaire d'élément 
  • ALT+FLECHE GAUCHE/ALT +FLECHE DROITE : Historique des positions du curseur.
  •  CTRL+SHIFT+F : Indentation automatique
  • CTRL+M : Agrandir la vue courante.
  • CTRL+F7 : Passer à la vue suivante.
  • CTRL+SHIFT+F7 : Passer à la vue précédente.
  • CTRL+D : Supprimer la ligne courante.
  • ALT+FLECHE HAUT/ALT+FLECHE BAS : Déplacer la ligne ou la sélection vers le haut/vers le bas.
  • CTRL+SHIFT+O : Réorganiser les « import ».
  • CTRL+SHIFT+R : Rechercher un fichier dans le workspace.
  • CTRL+O : Outline, pour afficher les membres de la classe actuelle et s’y rendre. Appuyer une deuxième fois CTRL+O affiche également les éléments hérités.
  • CTRL+T : Arbre d’héritage.
  • CTRL+ALT+H : Hiérarchie d’appels.
  • CTRL+O : Afficher l'OutLine du fichier en cours
Vous trouverez la liste complète ici : http://eclipse-tools.sourceforge.net/Keyboard_shortcuts_%283.0%29.pdf

vendredi 17 août 2012

[JAVA] Introspection/Reflexivité

Ci-dessous un exemple simple d'utilisation de l'introspection ou reflexivité en java.
Tout d'abord je récupère le nom de ma classe.
Je crée une variable objet qui va me permettre de stocker la nouvelle instance de cette classe.
Pour appeler une méthode, dans mon cas, la méthode s'appelle, "setIdentifiant" et a pour parametre un "String". Il faut donc créer deux tableauxqui vont contenir
  • la liste de types des paramètres (String.class ici)
  • la liste des valeurs des paramètres ("test" ici)
Il faut ensuite, créer un objet Method  qui va nous servir à appeler notre méthode. On lui passe en paramètre, le nom de la méthode et la liste des types des paramètres de la méthode.

Nous pouvons maintenant appeler(ou invoquer )la méthode en lui passant en paramètre notre objet et la liste des valeurs de la méthode.

//Récupération du nom de classe(avec le package)
String nomClasse=MaClasse.class.getCanonicalName();
Object monObjet = null;

Class c = Class.forName(nomClasse);

// Instanciation d'un nouvel objet de cette classe
monObjet = c.newInstance();

// Tableau contenant les types des arguments
Class[] paramTypes = new Class[1];
               
// Tableau contenant les valeurs des arguments           
Object[] arg = new Object[1];

// Appel de la méthode
paramTypes[0] = String.class;
Method m = c.getMethod("setIdentifiant", paramTypes);
arg[0] = "test";

//Invocation de la méthode
m.invoke(monObjet, arg);


Pour aller plus loin, il faut savoir que l'appel d'une méthode par introspection est plus lourd qu'un appel direct.
Mais celà est à relativiser, vous trouverez dans ce lien, le différence du cout d'appel à une méthode par introspection et sans introspection, ainsi que sur un serveur et une machine simple :
http://buzdin.blogspot.fr/2011/01/is-java-reflection-really-slow.html