2010-05-31 12 views
13

Ich bin auf der Suche nach Möglichkeiten zum Vergrößern einer Java Swing-Anwendung. Das bedeutet, dass ich alle Komponenten in einem bestimmten JPanel um einen bestimmten Faktor skalieren möchte, so als würde ich einen Screenshot der Benutzeroberfläche erstellen und eine "Bildskalierung" anwenden. Die Schriftgröße sowie die Größe von Ankreuzfeldern, Textfeldern, Cursorn usw. müssen angepasst werden. Es ist möglich, eine Komponente, die durch Anwenden der Transformationen auf einer Grafik zu skalieren Objekt:Zoom in Java Swing Anwendung

protected Graphics getComponentGraphics(Graphics g) { 
    Graphics2D g2d=(Graphics2D)g; 

    g2d.scale(2, 2); 

    return super.getComponentGraphics(g2d); 
} 

, dass so lange funktioniert, wie Sie nicht über sich selbst aktualisierenden Komponenten kümmern. Wenn Sie in Ihrer Anwendung ein Textfeld haben, funktioniert dieser Ansatz nicht mehr, da sich das Textfeld jede Sekunde aktualisiert, um den (blinkenden) Cursor anzuzeigen. Und da dieses Mal das modifizierte Grafikobjekt nicht verwendet wird, erscheint die Komponente am alten Ort. Gibt es eine Möglichkeit, ein Komponentengrafikobjekt dauerhaft zu ändern? Es gibt auch ein Problem mit den Mausklick-Event-Handlern. Die andere Möglichkeit wäre, alle untergeordneten Komponenten des JPanel (setPreferredSize) auf eine neue Größe zu skalieren. Das funktioniert nicht bei Ankreuzfeldern, da das angezeigte Bild des Ankreuzfeldes seine Größe nicht ändert. Ich habe mir auch überlegt, meinen eigenen Layoutmanager zu programmieren, aber ich glaube nicht, dass dies funktionieren wird, da Layoutmanager nur die Position (und Größe) von Objekten ändern, aber nicht in Checkboxen hineinzoomen können (siehe vorheriger Abschnitt). Oder irre ich mich mit dieser Hypothese? Haben Sie Ideen, wie Sie eine zoombare Swing GUI ohne Programmierung von benutzerdefinierten Komponenten erreichen können? Ich suchte nach drehbaren Benutzerschnittstellen, weil das Problem bekannt scheint, aber ich fand auch keine befriedigende Lösung für dieses Problem.

Danke für Ihre Hilfe, Chris

+0

Skalierung bereits gerenderten Komponenten, die Dinge wie Anti-Alias-Schriften enthalten, werden beschissene Ergebnisse liefern, besonders wenn diese Schriften RGB-Dezimierung/Sub-Pixel-Anti-Aliasing verwenden. – NoozNooz42

Antwort

9

Sie könnten einen Versuch der JXLayer library geben.

Es gibt mehrere Werkzeuge, die Ihnen beim Zoomen helfen könnten. Überprüfen Sie die Beispiele shown here. Ich würde Ihnen empfehlen, mehr über die TransformUI aus dieser Bibliothek zu lesen. Aus dem Beispiel scheint es, als könnte es helfen, Ihr Problem zu lösen.

+0

Danke für Ihre Antwort! Dies scheint ein sehr guter Weg, dies zu tun. Ich lasse die Frage noch einige Stunden offen, falls es andere Leute gibt, die zu diesem Thema beitragen können, aber Angst vor Fragen haben, die als "beantwortet" markiert sind :-) – Shirky

+0

@Shirky - es gibt keinen Notfall zu akzeptieren, vor allem wenn jemand etwas Besseres mitbringt;) – Gnoupi

+0

Zeit sich zu verabschieden ;-). Ich schließe die Frage, Ihre Antwort war genau das, wonach ich suchte. Vielen Dank. – Shirky

7

Die Skalierung der Ansicht ist einfach. die Transformation von Mauskoordinaten ist nur etwas schwieriger. Hier ist ein elementarer example. Ich würde JComponent heraus halten, obwohl es sinnvoll wäre, eine analoge ScaledComponent zu entwickeln, die über die Geometrie weiß. Das ist, wo @ Gnoupi Vorschlag einer Bibliothek kommt.

+1

Danke für Ihre Antwort. Ich habe nach einem allgemeinen Ansatz gesucht. Die Anpassung einzelner Komponenten (der Artikel, mit dem Sie verbunden sind) ist ein weiteres Problem. – Shirky

2

hey können Sie dies versuchen, wenn Sie ein Bild wie jeder andere Bildbetrachter ein JPanel ein Bild mit der drawImage() -Methode erstellen möchten, erstellen Sie jetzt eine Schaltfläche und wenn Sie auf die Schaltfläche klicken Sie auf die Größe des Panels auf dem Rahmen erhöhen es scheint, als ob das Bild

2

in Zoom betrachtet wird vielleicht finden Sie Piccolo2D.java API nützlich: http://code.google.com/p/piccolo2d/

es ist sehr einfach.

Es zeichnet sich insbesondere durch seine reibungslose Zoom. Sie erstellen im Wesentlichen eine "Leinwand", die verschiedene Elemente enthalten kann, und können dann zoomen, indem Sie die rechte Maustaste gedrückt halten und die Maus vor und zurück bewegen.

ich in einem Team gearbeitet, die es verwendet, um dieses zu erstellen: http://sourceforge.net/apps/mediawiki/guitar/index.php?title=WebGuitar#EFG.2FGUI_Visualizer

den Knoten Sie es sich anklickbare Links sind zu sehen.