Zum Zoom-Problem:
Prinzipiell ist die möglich, allerdings ist das relativ kompliziert. Wenn alle zu zoomen Objekte in einem Container sind (z.B. JPanel), kann man eine Unterklasse davon konstruieren und muss hier die paint-Methode überschreiben. Der Trick dabei ist es dann auf das Graphics Objekt eine Transformation anzuwenden, die den Zoomfaktor einstellt und dieses dann auch für alle Komponenten verwenden.
public void paint(Graphics g) {
Graphics2D currentGraphics = (Graphics2D) g;
AffineTransform t = currentGraphics.getTransform();
if (t.getScaleX() != zoomFactor) {
AffineTransform nT = new AffineTransform(t);
AffineTransform scale = new AffineTransform();
scale.setToScale(zoomFactor, zoomFactor);
scale.preConcatenate(nT);
currentGraphics.setTransform(scale);
}
… und ab hier dann paint mit dem angepassten Grahics Objekt weiter abarbeiten.
}
Probleme dabei:
–> RepaintManager muss teilweise manuell aufgerufen werden, damit die View wirklich vernünftig aktualisiert wird, anscheinend werden beim einfügen einer Trasnformation nicht alle Regionen als dirty markiert
–> Probleme mit der DoubleBuffer Strategie, bei manchen Grafiktreibern führt dies dazu, dass ein Teil des sichtbaren Bildes dafür verwendet wird, in dem Fall kann man dies explizit ausschalten:
RepaintManager.currentManager(this).setDoubleBufferingEnabled(false);
in einigen Fällen hilft auch das setzen der Variable „swing.volatileImageBufferEnabled“ auf false (java -D…).
Das ganze ist aber wie gesagt nicht einfach, ich habe selber so eine Anwendung für das Layouten von Formularen entwickelt, bei der man das Layout wie in einem normalen Textverarbeitungsprogramm vergrössern und verkleinern kann. Es gibt hier keine schnelle Lösung, sondern man muss sich hier einarbeiten.