在 JPanel 上缩放图形

Zoom graphics on JPanel

我目前正在研究如何放大绘制有图形的 JPanelJPanel 当前嵌入在 JScrollPane 中,当缩放级别超过 100% 时,应该允许用户滚动。

现在,我可以正确放大面板,但 AffineTransform 不适用于鼠标事件。此外,当 scrollBars 可见时,它们太长了。我不希望它们比 JPanel.

的原始大小长
private AffineTransform m_zoom;

@Override
protected void paintComponent(Graphics p_g) {
    if (m_mainWindow != null) {
        m_zoom = ((Graphics2D) p_g).getTransform();
        m_zoom.scale(m_scale, m_scale);
        ((Graphics2D) p_g).transform(m_zoom);

        super.paintComponent(p_g);
    }
    p_g.dispose();
}

public void setScale(double p_scale) {
    m_scale = p_scale;
    repaint();
    revalidate();
}

如果有人能帮助我解决所有这些问题,将不胜感激! 谢谢

好的,我知道 JScrollPane 是怎么回事了。我根据新的缩放级别手动调整了 JPanel 的大小并且有效。

public void setScale(double p_newScale) {
    m_scale = p_newScale;
    int width = (int) (getWidth() * m_scale);
    int height = (int) (getHeight() * m_scale);
    setPreferredSize(new Dimension(width, height));
    repaint();
    revalidate();
}

我仍然需要找到一种方法来计算 JPanel 缩放 in/out 时鼠标的位置。我应该直接在我的自定义 JPanel class 中覆盖 mouseClickedmouseMoved 方法吗?

编辑:

我在 JPanel 上对相对坐标使用了简单的除法。它对 mouseMoved 和 mouseClicked 都非常有效。

Point zoomedLocation = new Point((int)(evt.getPoint().x / m_zoomFactor),
            (int)(evt.getPoint().y / m_zoomFactor));

而且我到处都使用 zoomedLocation 而不是 evt.getPoint()