我目前正在尝试弄清楚如何放大在其上绘制图形的JPanel
。 JPanel
目前已嵌入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();
}
如果有人可以帮助我完成所有这些,那将非常感激! 谢谢
答案 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
课程中覆盖mouseMoved
和JPanel
方法吗?
编辑:
我在JPanel的相对坐标上使用了一个简单的除法。它对mouseMoved和mouseClicked都很有效。
Point zoomedLocation = new Point((int)(evt.getPoint().x / m_zoomFactor),
(int)(evt.getPoint().y / m_zoomFactor));
我在任何地方使用zoomedLocation
代替evt.getPoint()
。