Performant mit MouseWheel zoomen

Status
Nicht offen für weitere Antworten.

cyliax

Mitglied
Ich habe jetzt hier schon ne Weile nach Lösungen gesucht meinen Zoom irgendwie zu beschleunigen, aber ich denke, ich habe grundsätzlich nen falschen Ansatz. Nehme mal an das Image jedesmal vom Panel zu löschen und wieder neu zu adden braucht einfach zu viel Zeit. Nun habe ich mit diese paintComponent und repaint Geschichten angesehen, aber das ist AWT oder? Und das soll man ja nicht mit Swing mischen?

Hier mal ein Code Ausschnitt:

Code:
	public void reScale(JPanel panel, Dimension dimension) {
		if (orgImage != null) {
			scaledDimension = dimension;
			panel.removeAll();
			Image image = orgImage.getScaledInstance(scaledDimension.width, scaledDimension.height, Image.SCALE_FAST);
			this.add(new JLabel(new ImageIcon(image)));
			panel.add(getComponent(0));
		}
	}

Angesteuert wird das ganze von:

Code:
		MouseWheelListener mouseWheelListener = new MouseWheelListener() {
			@Override
			public void mouseWheelMoved(MouseWheelEvent e) {
				if (myMediaFiles[1] != null) {
					if (e.getWheelRotation() < 0) {
						myMediaFiles[1].reScale(panel[1], new Dimension (myMediaFiles[1].getScaledDimension().width+2, myMediaFiles[1].getScaledDimension().height+2));
					}
					else {
						myMediaFiles[1].reScale(panel[1], new Dimension (myMediaFiles[1].getScaledDimension().width-2, myMediaFiles[1].getScaledDimension().height-2));
					}
				}
				panel[1].validate();
				panel[1].repaint();
			}
		};

Nehme an, da gibts ne ganz einfach Lösung, die ich bisher nur einfach übersehen habe. Danke euch schonmal.

PS: Was auch noch tool wäre, wenn die Qualitätseinstellung während des Skalierens auf FAST steht und dann nach ner halben Sekunde Nichtbenutzung des Scrollrades nochmal in SMOOTH gerendert wird.
 

Marco13

Top Contributor
Bei jeder Zoom-Stufe ein neues Bild zu erstellen ist ... :autsch:

Es wäre sicher schon um etliche Größenordnungen schneller, wenn du nur das Bild in der passenden Größe zeichnen würdest... grob sowas
Code:
class ImagePanel extends JPanel
{
    private Image fullSizeImage;

    private int zoomedWidth
    private int zoomedHeight;

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(fullSizeImage, 0,0, zoomedWidth, zoomedHeight, this);
    }

    public void setZoomedSize(int w, int h)
    {
        this.zoomedWidth = w;
        this.zoomedHeight = h;
        repaint();
    }

}

Schau auch mal hier: java.net: The Perils of Image.getScaledInstance() das was dort steht ("As an aside to the aside, in some rare cases I've even seen the following technique used in developers' code (this is an example of what not to do):" ist genau das was du gemacht hast :D )

Die Qualität umzustellen wäre dann (mit RenderingHints) recht leicht - das "verzögerte neuzeichnen mit hoher Qualität" kann man mit einem Thread erledigen.
 

cyliax

Mitglied
danke dir, ich komme also nicht um dieses paintComponent drumherum. ich werde das so mal versuchen. danke für das kurze beispiel.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Image performant skalieren AWT, Swing, JavaFX & SWT 5
lumo SWT ScrolledComposite MouseWheel verhindern AWT, Swing, JavaFX & SWT 3
G MouseWheel nur wenn MouseOver! AWT, Swing, JavaFX & SWT 5
F Probleme mit MouseWheel events in SWT AWT, Swing, JavaFX & SWT 13
C JFreeChart X-Achse Werte skalieren, begrenzen, zoomen AWT, Swing, JavaFX & SWT 5
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
L Graphics2d zoomen AWT, Swing, JavaFX & SWT 3
T JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
P Scrollbalken verschwinden beim Zoomen AWT, Swing, JavaFX & SWT 4
F Zoomen in JPanel AWT, Swing, JavaFX & SWT 3
J Diverse Grafiken in JPanel anzeigen und zoomen AWT, Swing, JavaFX & SWT 3
J zoomen in JPanel AWT, Swing, JavaFX & SWT 15
F 2D-Grafik Skalieren der Scrollbars beim Zoomen einer JScrollPane AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Im 2D Spiel zoomen AWT, Swing, JavaFX & SWT 6
0 2D-Grafik 2D Bibliothek zum Zeichnen und Zoomen gesucht AWT, Swing, JavaFX & SWT 4
M Zoomen in ein JPanel... und eine andere kleine Frage AWT, Swing, JavaFX & SWT 3
bj99 Swing [Erledigt] Bild schrittweise zoomen AWT, Swing, JavaFX & SWT 4
G JScrollpage: Viewport beim Zoomen immer relative zentrieren AWT, Swing, JavaFX & SWT 5
F [Java 1.5] Shapes auf einem JPanel zoomen AWT, Swing, JavaFX & SWT 11
M auch JScrollPane aber mit Zoomen, wie wird der View gesetzt AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben