Problem:
Die Zoom-to-Fit-Buttons funktionieren nicht, sind aber trotzdem aktiviert. Andere Zoom-Funktionalitäten sind funktionsfähig (z. B. der Zoom auf einen festen Prozentwert).
Gleiches gilt für das Zoom Snap-In:
Möglicher Grund:
Presentation Rules sind nicht gesetzt.
Beim Aufbau der GUI muss z. B. folgendes Code-Fragment ausgeführt werden:
// add presentation rules final List<PresentationRule> rules = mainViewer.getPageView().getPresentationRuleManager().getRules(); rules.add(new SwitchToSinglePageOnFit()); rules.add(new ApplyDynamicZoomRule());
Anwendungsbeispiel: JadiceDemoApplication.initialiseGUI()
Dynamic Zoom Modes
- ZOOM_MODE_FIT_BOTH
- ZOOM_MODE_FIT_WIDTH
- ZOOM_MODE_FIT_HEIGHT
stehen nur im Einzelseiten-Layout zur Verfügung. Daher müssen zur korrekten Verwendung der Fit Funktionen beide PresentationRules com.levigo.jadice.swing.pageview.SwitchToSinglePageOnFit
und com.levigo.jadice.swing.pageview.ApplyDynamicZoomRule
gesetzt sein.
Hintergrundinformationen
PresentationRules
Die Instanzen von PresentationRule
erlauben das Anpassen der Seitenanzeige als Reaktion auf verschiedene Events. Konkret handelt es sich dabei um die folgenden vier Events, die in jeweils eigenen Methoden-Implementationen behandelt werden können:
- Änderung der RenderSettings. Diese legen fest, wie eine Seite gerendert werden soll. Das beinhaltet zum Beispiel den Zoom-Faktor.
- Größenänderung der
PageView
-Komponente (z. B. durch Resizing des JFrame der Applikation) - Seitenwechsel innerhalb des Dokuments (Achtung: Dies beinhaltet nicht den Dokumentwechsel.)
- Änderung des Seitenlayouts
Das Setzen von PresentationRules erlaubt somit vielfältige Anpassungen des Verhaltens der Seitenanzeige.
Einpassen, die Fit Modi
Einpassen als Funktion ist verbunden mit den Fragen:
- Was wird eingepasst? und
- Was ist die Referenz, worin wird eingepasst?
Die jadice Funktionen "Einpassen" und deren zugrunde liegende Berechnungen, beziehen sich auf das Einpassen genau einer Seite, konkret der jeweils aktuellen Seite, in die Viewportgröße der PageView. Das heißt, die Berechnung liefert die Skalierung der aktuellen Seite eingepasst in den kompletten sichtbaren Bereich der PageView. Ein Bezug oder eine Relation auf die Gesamtheit der Seiten im Dokument oder andere sichtbare Seiten, ist nicht Teil der Funktionsumfangs. Als solches sind diese Funktionen ausgelegt für die ausschließliche Verwendung im SinglePageLayout. (siehe auch Hinweis oben)
Die "Einpassen"-Funktionen werden in jadice als Modus angeboten. Das bedeutet, dass nicht nur ein einmaliges Fitting einer bestimmten Seite in den Viewport erfolgt, sondern dass diese Einpassung bei Wechsel der aktuellen Seite erneut durchgeführt werden soll, solange der Modus aktiv ist. Dies ist insbesondere für Dokumente mit extrem unterschiedlichen Seitengrößen gedacht.
Durch die Nutzung von Mehrseiten-Layouts wird dem jeweils aktiven Layout die Hoheit über die Positionierung und Skalierung der Seiten übergeben. Die zentrale Aufgabe eines Layouts ist es, stets alle Seite optimal in das gewünschte Layout Muster einzupassen. Dies kollidiert mit dem Einzelseiten-Einpassen und Modus Verhalten, dass eine Skalierung und Positionierung einer bestimmten Seite vorgeben will. In der konkurrierenden Situation, also Verwendung eines Mehrseiten-Layouts und einem Einpassen Modi, kann es zu unerwarteten Effekten kommen. Dies tritt beispielsweise beim Scrollen (=dynamischer Wechsel der aktiven Seite) auf. Ein zuverlässiges Darstellungsverhalten kann in diesem Fall nicht zugesichert werden.
Aus diesem Grund existieren die zwei mitgelieferten Presentation Rules:
- com.levigo.jadice.swing.pageview.ApplyDynamicZoomRule
- Sorgt dafür, dass die Auswahl eines Dynamic Zoom Mode (ein ›Anpassen‹-Modus) auch tatsächlich dazu führt, dass die Seitenanzeige angepasst wird. So wird bei jedem Seitenwechsel erneut die tatsächliche Seitengröße und der Skalierungsfaktor berechnet, um nach der festgelegten Vorgabe anzupassen. Nachfolgend muss die Seite für die berechneten Faktoren ggf. aufbereitet und neu gerendert werden. (siehe auch Hinweis oben)
- com.levigo.jadice.swing.pageview.SwitchToSinglePageOnFit
- Wechselt bei Auswahl eines Dynamic Zoom Mode (ein ›Anpassen‹-Modus) auf das Einzelseiten-Layout
Wie oben beschrieben ist der dynamische Zoom ausgelegt für die Verwendung im Einzelseiten-Layout. Zur Sicherstellung der Funktionsweise, existiert die Presentation Rule SwitchToSinglePageOnFit. Diese muss zwingend registriert werden, wenn der dynamische Zoom korrekt genutzt werden soll.
- Wechselt bei Auswahl eines Dynamic Zoom Mode (ein ›Anpassen‹-Modus) auf das Einzelseiten-Layout