将Graphics2d调整为JScrollPane

关于问题调整组件大小而不重新绘制是我的问题如何在窗体中创建可修改的自定义Graphics2d

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ZoomWithSelectionInViewport implements MouseWheelListener { private JComponent b; private int hexSize = 3; private int zoom = 80; private JScrollPane view; public ZoomWithSelectionInViewport() throws Exception { b = new JComponent() { private static final long serialVersionUID = 1L; @Override public Dimension getPreferredSize() { return new Dimension(700, 700); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = ((Graphics2D) g); int vertOffsetX, vertOffsetY, horizOffsetX, horizOffsetY; vertOffsetX = (int) ((double) hexSize * Math.sqrt(3.0f)); vertOffsetY = (int) ((double) -hexSize - 1 * Math.sqrt(3.0f) / 2.0f); horizOffsetX = (int) ((double) hexSize * Math.sqrt(3.0f)); horizOffsetY = (int) ((double) hexSize + 1 * Math.sqrt(3.0f) / 2.0f); for (int x = 0; x < 50; x++) { for (int y = 0; y < 50; y++) { int[] xcoords = new int[6]; int[] ycoords = new int[6]; for (int i = 0; i  0) { hexSize -= Integer.signum(e.getWheelRotation()); } Dimension targetSize = new Dimension(b.getWidth() + zoom, b.getHeight() + zoom); b.setPreferredSize(targetSize); b.setSize(targetSize); b.revalidate(); b.repaint(); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { ZoomWithSelectionInViewport example = new ZoomWithSelectionInViewport(); } catch (Exception ex) { // } } }); } } 

如果我理解正确,您希望滚动窗格的滚动条反映当前的缩放状态。 我看到两种选择:

  • 不要覆盖组件中的getPreferredSize() ,并调整鼠标侦听器中的首选大小以包含缩放的图像; 它似乎在右侧略微截断。

  • 覆盖组件中的getPreferredSize() ,并调整返回的Dimension (现在为常量)以包含paintComponent()隐式的缩放边界。

我更喜欢后者。 我还发现编写显式转换函数来转换缩放和非缩放坐标很有帮助,如下所示。 此处显示的反向AffineTransform也是可能的。