在JPanel上缩放图形

时间:2015-12-09 16:46:48

标签: java swing jpanel zoom affinetransform

我目前正在尝试弄清楚如何放大在其上绘制图形的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();
}

如果有人可以帮助我完成所有这些,那将非常感激! 谢谢

1 个答案:

答案 0 :(得分:0)

好的,我弄明白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放大/缩小。我应该直接在自定义mouseClicked课程中覆盖mouseMovedJPanel方法吗?

编辑:

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

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

我在任何地方使用zoomedLocation代替evt.getPoint()