2016-06-08 5 views
1

Je travaille sur une applet java qui a un document chargé. Sur cette applet j'ai un bouton "print" personnalisé qui initalement le processus d'impression du document. Ceci est le code qui est exécuté après pression sur cette touche: (?)executeDispatch synchrone?

PropertyValue[] printProperties = new PropertyValue[1]; 
printProperties[0] = new PropertyValue(); 
printProperties[0].Name = "Print"; 
printProperties[0].Value = new Boolean(true); 

xDispatchProvider = (XDispatchProvider)UnoRuntime.queryInterface (XDispatchProvider.class, xFrame); 
dispatcher.executeDispatch(xDispatchProvider, ".uno:Print","_self", 0, printProperties); 

someOtherProcess(); 

Ce code ouvre la boîte de dialogue d'impression natif qui est le comportement attendu, et fonctionne jusqu'à présent. Le problème est la méthode "someOtherProcess". J'ai besoin d'exécuter cette méthode juste après la fermeture de la boîte de dialogue d'impression en appuyant sur le bouton "imprimer" ou en annulant/fermant la boîte de dialogue d'impression.

Comme executeDispatch est asynchrone, j'ai essayé de le rendre synchrone en utilisant le "SynchronMode" dans PropertyValue [] sans succès.

J'ai trouvé un moyen d'écouter les événements d'impression qui sont déclenchés lorsque le processus d'impression commence ou lorsqu'il est annulé. Voici le code tout:

PropertyValue[] printProperties = new PropertyValue[1]; 
printProperties[0] = new PropertyValue(); 
printProperties[0].Name = "Print"; 
printProperties[0].Value = new Boolean(true); 

xDispatchProvider = (XDispatchProvider)UnoRuntime.queryInterface (XDispatchProvider.class, xFrame); 

dispatcher.executeDispatch(xDispatchProvider, ".uno:Print","_self", 0, printProperties); 

XPrintJobBroadcaster xPrintJobBroadcaster = (XPrintJobBroadcaster)UnoRuntime.queryInterface(XPrintJobBroadcaster.class, xComponent); 
xPrintJobBroadcaster.addPrintJobListener(new MyPrintJobListener()); 



class MyPrintJobListener implements XPrintJobListener { 
    public void printJobEvent(PrintJobEvent printJobEvent) { 
     AppletLogger.log("printing"); 
    } 
    public void disposing(com.sun.star.lang.EventObject eventObject) { 
     AppletLogger.log("disposing"); 
    } 
} 

Le « printJobEvent » est déclenché lorsque le processus d'impression a soit commencé, terminé, annulé et ainsi de suite, mais je ne peux pas trouver un moyen de savoir si la boîte de dialogue d'impression a été annulé ou fermé car cela ne déclenche aucun événement d'impression. Mes questions principales sont donc: existe-t-il un moyen d'ouvrir une boîte de dialogue d'impression de manière synchrone afin que les programmes attendent la fermeture de la boîte de dialogue d'impression? Existe-t-il un moyen d'écouter l'événement de fermeture de la fenêtre de dialogue d'impression native?

Merci d'avance!

+0

* "Je travaille sur une applet Java." * Vous avez quelques années de retard. Voir [Prise en charge du plug-in Java déconseillée] (http://www.gizmodo.com.au/2016/01/rest-in-hell-java-plug-in/) et [Déplacement vers un site Web sans plug-in] (https: //blogs.oracle.com/java-platform-group/entry/moving_to_a_plugin_free). –

+0

Merci pour l'info @AndrewThompson, je le savais déjà. La chose est à mon entreprise, nous travaillons toujours avec ces applets pour les clients qui ne veulent pas une mise à niveau. – shittyProgram

+0

* ".. pour les clients qui ne veulent pas de mise à niveau" * Il arrive un moment où une entreprise doit décider s'il en coûtera plus cher de répondre aux clients vautrés dans leur obsolescence, ou de les vider. Il est maintenant tel qu'il en coûtera plus pour répondre à eux. –

Répondre

0

Vérifiez la propriété State. Si l'impression est annulée, elle doit d'abord afficher JOB_STARTED (0), puis JOB_ABORTED (3).

class MyPrintJobListener implements XPrintJobListener { 
    public void printJobEvent(PrintJobEvent printJobEvent) { 
     AppletLogger.log("print status: " + printJobEvent.State.getValue()); 
    } 
    public void disposing(com.sun.star.lang.EventObject eventObject) { 
     AppletLogger.log("disposing"); 
    } 
} 

Le répartiteur ne fonctionnait pas pour moi. Utilisez l'interface API à la place:

XPrintJobBroadcaster xPrintJobBroadcaster = (XPrintJobBroadcaster) 
    UnoRuntime.queryInterface(XPrintJobBroadcaster.class, xComponent); 
xPrintJobBroadcaster.addPrintJobListener(new MyPrintJobListener()); 

XPrintable xPrintable = 
    (XPrintable)UnoRuntime.queryInterface(XPrintable.class, xComponent); 
xPrintable.print(printProperties); 

try { Thread.sleep(10000); } catch (Exception e) {} // Wait for print job. 
+0

Merci pour votre aide @Jim, je savais déjà que je peux vérifier l'état du processus d'impression. Si vous appuyez sur le bouton "Imprimer", le processus d'impression est démarré et la réussite ou l'échec du processus sera notifié à la méthode printJobEvent. Aussi la deuxième solution n'ouvre pas la boîte de dialogue d'impression et j'en ai besoin. – shittyProgram