我试图在一个内部实现位置敏感的缩放JScrollPane
.它JScrollPane
包含一个定制的组件,paint
它将在分配的任何空间内绘制自己 - 因此缩放就像使用MouseWheelListener
根据需要调整内部组件大小一样容易.
但我也希望放大(或退出)一个点,使得该点尽可能在生成的放大(或 - )视图中保持中心(这就是我所说的'位置敏感'缩放),类似如何在谷歌地图中缩放工作.我确信之前已经做了很多次 - 有没有人知道在Java Swing下做"权利"的方式?玩Graphic2D
转换而不是使用会更好JScrollPanes
吗?
示例代码如下:
package test; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import javax.swing.*; public class FPanel extends javax.swing.JPanel { private Dimension preferredSize = new Dimension(400, 400); private Rectangle2D[] rects = new Rectangle2D[50]; public static void main(String[] args) { JFrame jf = new JFrame("test"); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(400, 400); jf.add(new JScrollPane(new FPanel())); jf.setVisible(true); } public FPanel() { // generate rectangles with pseudo-random coords for (int i=0; i0) ? 1 / d : -d; int w = (int) (getWidth() * d); int h = (int) (getHeight() * d); preferredSize.setSize(w, h); getParent().doLayout(); // Question: how do I keep 'p' centered in the resulting view? } public Dimension getPreferredSize() { return preferredSize; } private Rectangle2D r = new Rectangle2D.Float(); public void paint(Graphics g) { super.paint(g); g.setColor(Color.red); int w = getWidth(); int h = getHeight(); for (Rectangle2D rect : rects) { r.setRect(rect.getX() * w, rect.getY() * h, rect.getWidth() * w, rect.getHeight() * h); ((Graphics2D)g).draw(r); } } }
Kevin K.. 8
经过测试,似乎有效......
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
鼠标光标下方.
经过测试,似乎有效......
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
鼠标光标下方.