2017-10-10 9 views
0

Nous avons rencontré un problème en utilisant Paperclips (bibliothèque d'impression pour SWT) sur des moniteurs mis à l'échelle, mais je ne pense pas que cela ait quelque chose à voir avec le framework et l'environnement Eclipse.Mise à l'échelle différemment dans Java et Eclipse Framework

Voyons un exemple:

enter image description here

gauche est l'impression sans mise à l'échelle (ou 100%), est juste la même impression a commencé sur un moniteur avec mise à l'échelle de 175%. Je sais ce que vous pensez: le moniteur et sa résolution/mise à l'échelle ne devraient avoir aucune influence sur une impression. À droite, devrait.

Bien que ce soit triste et tout, ce ne serait pas vraiment un problème. Mais voici le kicker: Les impressions ci-dessus ont été générées par un test JUnit exécuté en tant que test de plug-in. Si je les exécute comme un test unitaire régulier les deux travail.

Il est clair que quelque chose dans l'environnement Eclipse fonctionne différemment lorsqu'il est démarré dans un contexte OSGi, et j'essaie de savoir de quoi il s'agit (donc je peux peut-être l'empêcher).

Et je pense que c'est un joli puzzle.

Si vous avez besoin d'un conseil pour quelle classe SWT pourrait être, je réduit à ce fichier ScalePrint.java pour la table (si je supprime l'instance de ScalePrint de ma démo, la table est affichée correctement, l'en-tête est toujours faux, cependant).

Je peux confirmer que l'erreur n'existe que dans Eclipse 4.6, et non pas dans les versions 4.5 ou 3.7 (ce qui n'est pas totalement surprenant puisque 4.6 est la première version à prendre en charge la mise à l'échelle). Et si j'ajoute -Dswt.autoScale=100 aux options VM pour désactiver la mise à l'échelle, cela fonctionne aussi comme prévu.

Je pourrais ajouter mon cas de test, mais comme je l'ai dit, je ne pense pas vraiment que cela ait quelque chose à voir avec Paperclips en soi.

Alors ... qu'est-ce qui pourrait casser la mise à l'échelle lorsque tout le framework Eclipse est démarré comparé à l'exécution du même code dans une application Java?

Répondre

0

Le problème est l'utilisation de la classe Transform, qui elle-même utilise le champ statique DPIUtil.deviceZoom (sous la forme DPIUtil.autoScaleUp(float dx)).

Depuis DPIUtil.deviceZoom est un champ statique tout échoue lorsqu'il est utilisé avec un moniteur principal qui a la mise à l'échelle (puisque les imprimantes ne le font pas).