【问题标题】:Zoom graphics on JPanel [duplicate]JPanel上的缩放图形[重复]
【发布时间】:2015-12-09 16:46:48
【问题描述】:

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

如果有人能帮我解决这一切,那将不胜感激! 谢谢

【问题讨论】:

  • 鼠标事件将永远改变以匹配您的缩放。 Swing 中没有缩放的概念。您必须自己在(鼠标)听众中进行数学运算。至于滚动条“太长”,同样是它的 your code 控制面板的首选大小 - 为缩放级别正确设置它,滚动条将匹配它。此外,您应该从不处置传递给您的paintComponent 方法的图形对象。
  • 您实际上可以使用 JXLayer/JLayer 做您想做的事情。链接的重复问题/答案具有可运行的示例,它不仅可以让您缩放图形,还可以缩放发生的事件,这真的很酷,它基本上适用于所有基于 Swing 的组件

标签: java swing jpanel zooming affinetransform


【解决方案1】:

好的,我知道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 放大/缩小时的位置。我应该直接在我的自定义JPanel 类中覆盖mouseClickedmouseMoved 方法吗?

编辑:

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

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

我在所有地方都使用zoomedLocation,而不是evt.getPoint()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2017-08-18
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    相关资源
    最近更新 更多