with ventana resizing redimensionar minimizar maximizar los componentes java swing resize

java - ventana - Conservar la posición relativa del mouse mientras se cambia el tamaño de un JPanel en un JScrollPane



redimensionar los componentes de un jframe al maximizar/minimizar la ventana (1)

Intente, en cambio, buscar la posición del mouse como un porcentaje del tamaño actual, y luego aplicarlo al nuevo tamaño:

newViewPos.x = (int)((ZOOM_IN_FACTOR * currSize.width) * (e.getPoint().x/(double)currSize.width));

como ejemplo. De esta forma, está mirando la posición del mouse relativa al panel de desplazamiento y conservando esa relación en el panel de zoom.

Estoy redimensionando un JPanel dentro de un JScrollPane, y quiero asegurarme de que el punto en el JPanel donde se encuentra mi mouse actualmente retiene su posición con respecto al JScrollPane después del cambio de tamaño (como lo hace Google Maps cuando se acerca / fuera).

Encuentro la posición del mouse en el JPanel, lo que me permite tratar con la ventana gráfica en varias posiciones. Lo multiplico por el factor de zoom para saber dónde estará el punto después de escalar. Luego restamos la posición del mouse en el ScrollPane para saber dónde estaba el punto con respecto al área visible. Estoy haciendo algo mal, sin embargo, y simplemente no puedo ver qué.

Código de ejemplo:

import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Point; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; public class Test { public static void main(String[] in) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { new Test(); } }); } public Test() { final JFrame frame = new JFrame(); final ScalablePanel child = new ScalablePanel(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(child, BorderLayout.CENTER); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } } class ScalablePanel extends JScrollPane implements MouseWheelListener { final double ZOOM_IN_FACTOR = 1.1; final double ZOOM_OUT_FACTOR = 0.9; final JPanel zoomPanel = new JPanel(); public ScalablePanel() { final javax.swing.JLabel marker = new javax.swing.JLabel("Testing the mouse position on zoom"); marker.setHorizontalAlignment(javax.swing.JLabel.CENTER); zoomPanel.setLayout(new BorderLayout()); zoomPanel.add(marker,BorderLayout.CENTER); getViewport().setView(zoomPanel); setPreferredSize(new Dimension(300,300)); addMouseWheelListener(this); } public void mouseWheelMoved(final MouseWheelEvent e) { if (e.isControlDown()) { if (e.getWheelRotation() < 0) zoomIn(e); else zoomOut(e); e.consume(); } } public void zoomIn(final MouseWheelEvent e) { // Get the mouse position with respect to the zoomPanel final Point pointOnZoomPanel = SwingUtilities.convertPoint( e.getComponent(), e.getPoint(), zoomPanel); // Resize panel final Dimension currSize = zoomPanel.getSize(); zoomPanel.setPreferredSize( new Dimension( (int)(currSize.width * ZOOM_IN_FACTOR), (int)(currSize.height * ZOOM_IN_FACTOR) )); // Find out where our point on the zoom panel is now that we''ve resized it final Point newViewPos = new Point(); newViewPos.x = (int)(ZOOM_IN_FACTOR * pointOnZoomPanel.x - e.getPoint().x); newViewPos.y = (int)(ZOOM_IN_FACTOR * pointOnZoomPanel.y - e.getPoint().y); // Move the viewport to the new position to keep the area our mouse was in the same spot getViewport().setViewPosition(newViewPos); zoomPanel.revalidate(); } public void zoomOut(final MouseWheelEvent e) { // Get the mouse position with respect to the zoomPanel final Point pointOnZoomPanel = SwingUtilities.convertPoint( e.getComponent(), e.getPoint(), zoomPanel); // Resize panel final Dimension currSize = zoomPanel.getSize(); zoomPanel.setPreferredSize( new Dimension( (int)(currSize.width * ZOOM_OUT_FACTOR), (int)(currSize.height * ZOOM_OUT_FACTOR) )); // Find out where our point on the zoom panel is now that we''ve resized it final Point newViewPos = new Point(); newViewPos.x = (int)(ZOOM_OUT_FACTOR * pointOnZoomPanel.x - e.getPoint().x); newViewPos.y = (int)(ZOOM_OUT_FACTOR * pointOnZoomPanel.y - e.getPoint().y); // Move the viewport to the new position to keep the area our mouse was in the same spot getViewport().setViewPosition(newViewPos); zoomPanel.revalidate(); } }