for(key in p) {
alert( p[key] );
}
Примечание: вы можете делать это по массивам, но вы будете перебирать и length
и другие свойства.
Проверено, похоже, работает ...
private void updatePreferredSize(int n, Point p) {
double d = (double) n * 1.08;
d = (n > 0) ? 1 / d : -d;
int w = (int) (getWidth() * d);
int h = (int) (getHeight() * d);
preferredSize.setSize(w, h);
int offX = (int)(p.x * d) - p.x;
int offY = (int)(p.y * d) - p.y;
setLocation(getLocation().x-offX,getLocation().y-offY);
getParent().doLayout();
}
Обновление
Вот объяснение: точка p
- это местоположение относительной мыши к FPanel
. Поскольку вы масштабируете размер панели, местоположение p
(относительно размера панели) будет масштабироваться с тем же коэффициентом. Вычитая текущее местоположение из масштабированного местоположения, вы получаете, насколько точка «смещается» при изменении размера панели. Затем нужно просто сместить расположение панели в области прокрутки на ту же величину в противоположном направлении, чтобы снова поместить p
под курсором мыши.
Ваш MouseWheelListener также должен определить местоположение курсора, переместить его в центр JScrollPane и скорректировать xmin/ymin и xmax/ymax содержания, которое будет просматриваться.
Я думаю, что такая команда должна работать ...
private void updatePreferredSize(int n, Point p) {
double d = (double) n * 1.08;
d = (n > 0) ? 1 / d : -d;
int w = (int) (getWidth() * d);
int h = (int) (getHeight() * d);
preferredSize.setSize(w, h);
// Question: how do I keep 'p' centered in the resulting view?
int parentWdt = this.getParent( ).getWidth( ) ;
int parentHgt = this.getParent( ).getHeight( ) ;
int newLeft = p.getLocation( ).x - ( p.x - ( parentWdt / 2 ) ) ;
int newTop = p.getLocation( ).y - ( p.y - ( parentHgt / 2 ) ) ;
this.setLocation( newLeft, newTop ) ;
getParent().doLayout();
}
РЕДАКТИРОВАТЬ: Поменял пару вещей.
Вот небольшой рефакторинг решения @Kevin K:
private void updatePreferredSize(int wheelRotation, Point stablePoint) {
double scaleFactor = findScaleFactor(wheelRotation);
scaleBy(scaleFactor);
Point offset = findOffset(stablePoint, scaleFactor);
offsetBy(offset);
getParent().doLayout();
}
private double findScaleFactor(int wheelRotation) {
double d = wheelRotation * 1.08;
return (d > 0) ? 1 / d : -d;
}
private void scaleBy(double scaleFactor) {
int w = (int) (getWidth() * scaleFactor);
int h = (int) (getHeight() * scaleFactor);
preferredSize.setSize(w, h);
}
private Point findOffset(Point stablePoint, double scaleFactor) {
int x = (int) (stablePoint.x * scaleFactor) - stablePoint.x;
int y = (int) (stablePoint.y * scaleFactor) - stablePoint.y;
return new Point(x, y);
}
private void offsetBy(Point offset) {
Point location = getLocation();
setLocation(location.x - offset.x, location.y - offset.y);
}