Как Вы реализуете чувствительное к положению изменение масштаба в JScrollPane?

for(key in p) {
  alert( p[key] );
}

Примечание: вы можете делать это по массивам, но вы будете перебирать и length и другие свойства.

11
задан tucuxi 24 November 2016 в 10:30
поделиться

4 ответа

Проверено, похоже, работает ...

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 под курсором мыши.

8
ответ дан 3 December 2019 в 09:21
поделиться

Ваш MouseWheelListener также должен определить местоположение курсора, переместить его в центр JScrollPane и скорректировать xmin/ymin и xmax/ymax содержания, которое будет просматриваться.

1
ответ дан 3 December 2019 в 09:21
поделиться

Я думаю, что такая команда должна работать ...


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();
}

РЕДАКТИРОВАТЬ: Поменял пару вещей.

1
ответ дан 3 December 2019 в 09:21
поделиться

Вот небольшой рефакторинг решения @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);
}
2
ответ дан 3 December 2019 в 09:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: