动态调整大小 jframe/image 或滚动

Dynamically resize jframe/image or scroll

正如这个问题 () 中所讨论的,我需要一个 jframe 来匹配提供的确切图像(图像本身最初是一个 PDF,已被转换为图像)

提供的解决方案确实为我的图像尺寸构建了一个 jframe,但我实际上看不到所有图像。我需要能够调整 jframe 的大小,并将图像动态调整为新的 jframe 大小。如果做不到这一点,我想如果我可以滚动 jframe 甚至放大或缩小,我至少可以看到我目前看不到的图像部分。

我需要这个的原因是,在我的代码中,我可以选择针对图像绘制 Rectangle2D - 代码吐出坐标 java.awt.geom.Rectangle2D$Float[x, y,w,h].

然后我将使用这些坐标从 Apache PDFbox 使用 PDFTextStripperbyArea class 提取原始 PDF 的区域。 PDFTextStripperbyArea 将其输入作为 Rectangle2D 测量值。因此,图像和 jframe 必须始终具有相同的大小才能检索准确的坐标。

有人可以帮忙吗?

要使用滚动窗格扭曲标签,您可以实施以下更改:

    //frame.setLayout(new FlowLayout()); - comment out -  use default (Borderlayout)
    JLabel lbl= new JLabel();
    lbl.setIcon(icon);
    JScrollPane jsp = new JScrollPane(lbl); //warp the label with a scrollpane 
    //frame.add(lbl); 
    frame.add(jsp); //add scrollpane to frame instead of lbl

您可以找到更多信息here

继续你的,你的基本问题归结为两个问题。

  1. 如何确定组件何时更改大小
  2. 缩放图像以满足新要求。

坦率地说,这两个主题都有很多可用的示例,您只需要将它们结合起来即可。您可以先看看:

  • maintaining aspect ratio of JPanel background image
  • Quality of Image after resize very low
  • Resizing icon to fit on JButton in Java?

以下是我在您之前的问题中提出的 ImagePanel 的修改,它将根据组件的大小缩放图像,同时保持纵横比。

public class ImagePane extends JPanel {

    private BufferedImage img;
    private Image scaled;

    public ImagePane(BufferedImage img) {
        this.img = img;
        this.scaled = img;
        addComponentListener(new ComponentAdapter() {

            @Override
            public void componentResized(ComponentEvent e) {
                Dimension size = getSize();
                if (size.width > size.height) {
                    size.width = -1;
                } else {
                    size.height = -1;
                }
                scaled = img.getScaledInstance(size.width, size.height, java.awt.Image.SCALE_SMOOTH);
            }

        });
    }

    @Override
    public Dimension getPreferredSize() {
        return scaled == null ? new Dimension(0, 0) : new Dimension(scaled.getWidth(this), scaled.getHeight(this));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (scaled != null) {
            Graphics2D g2 = (Graphics2D) g.create();
            g2.drawImage(scaled, 0, 0, this);
            g2.dispose();
        }
    }
}

该示例是为了简洁起见,Image#getScaledInstance 既不是最快的,也不是生成质量最好的结果。上面链接的前两个示例详细介绍了其他可能的解决方案。

您还需要计算和维护生成的比例因子,需要将其应用于任何其他绘画操作。

在这种情况下,我可能会想简单地计算缩放因子(而不是缩放图像)并在 paintComponent 中使用 AffineTransform 来应用它,但这一切都归结为需要