Muszę obliczyć nową pozycję rzutni podczas powiększania obrazu.JScrollPane - Przybliżenie względem pozycji myszy
UI jest zbudowany w następujący sposób:
- ImagePanel rysuje obraz
- ImagePanelWrapper jest owijanie JPanel wokół imagePanel
- JScrollPane zawiera ImagePanelWrapper
podczas powiększania lub out, współczynnik powiększenia ImagePanel zostanie zmieniony, a preferowany rozmiar ImagePanel zostanie ponownie obliczony. Dlatego obraz na tym panelu porusza się, mimo że ImagePanel pozostaje w tym samym punkcie widoku.
Następujące metody są wywoływane, gdy użytkownik przytrzymuje klawisz CTRL i używa kółka myszy. Podany punkt jest miejscem kursora dostarczonym przez MouseWheelListener. Dzięki funkcjonalności w tych metodach obraz jest już w tej samej górnej lewej pozycji podczas powiększania lub pomniejszania.
Problem polega na tym, że po prostu nie mogę wymyślić sposobu poruszania się względem myszy, na przykład Paint.NET. Jakieś pomysły?
/**
*
*/
public void zoomOut(Point point) {
this.imagePanel.setZoom(this.imagePanel.getZoom() * 0.9f);
Point pos = this.getViewport().getViewPosition();
int newX = (int) (pos.x * 0.9f);
int newY = (int) (pos.y * 0.9f);
this.getViewport().setViewPosition(new Point(newX, newY));
this.imagePanel.revalidate();
this.imagePanel.repaint();
}
/**
*
*/
public void zoomIn(Point point) {
this.imagePanel.setZoom(this.imagePanel.getZoom() * 1.1f);
Point pos = this.getViewport().getViewPosition();
int newX = (int) (pos.x * 1.1f);
int newY = (int) (pos.y * 1.1f);
this.getViewport().setViewPosition(new Point(newX, newY));
this.imagePanel.revalidate();
this.imagePanel.repaint();
}
+1 Niesamowite, odpowiedź. Najlepsze, jakie widziałem od dłuższego czasu. – max
Pan zasługuje na wielkie podziękowanie :) – EyeSpy
Mam podobne pytanie. Próbuję użyć AffineTransform, aby zrobić to samo i mam problem z zastosowaniem matematyki z tego pytania. Jeśli znajdziesz czas, możesz mi pomóc? http://stackoverflow.com/questions/37509908/zoom-in-at-mouse-cursor – bigblind