【问题标题】:Resize Graphics2d into JScrollPane将 Graphics2d 的大小调整为 JScrollPane
【发布时间】:2012-01-16 12:33:24
【问题描述】:

关于Resizing a component without repainting 的问题是我的问题是如何在表单中创建可调整大小的自定义 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 < 6; i++) {
                            xcoords[i] = (int) ((hexSize + x * horizOffsetX + y * vertOffsetX)
                                    + (double) hexSize * Math.cos(i * 2 * Math.PI / 6));
                            ycoords[i] = (int) (((getSize().height / 2) + x * horizOffsetY
                                    + y * vertOffsetY) + (double) hexSize * Math.sin(i * 2 * Math.PI / 6));
                        }
                        g2d.setStroke(new BasicStroke(hexSize / 2.5f));
                        g2d.setColor(Color.GRAY);
                        g2d.drawPolygon(xcoords, ycoords, 6);
                    }
                }
            }
        };
        view = new JScrollPane(b);
        b.addMouseWheelListener(this);
        JFrame f = new JFrame();
        f.setLocation(10, 10);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(view);
        f.setPreferredSize(b.getPreferredSize());
        f.pack();
        f.setVisible(true);
    }

    public void mouseWheelMoved(MouseWheelEvent e) {
        zoom = 100 * -Integer.signum(e.getWheelRotation());
        if (hexSize - Integer.signum(e.getWheelRotation()) > 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) {
                    //
                }
            }
        });
    }
}

【问题讨论】:

    标签: java swing jscrollpane graphics2d


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,因为我真的不明白什么,怎么,为什么会这样,就像啄木鸟一样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2015-02-07
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多