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

时间:2017-10-22 16:48:43

标签: java jframe pdfbox

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

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

我需要这个的原因是,在我的代码中,我可以选择在图像上绘制一个Rectangle2D - 代码吐出坐标为java.awt.geom.Rectangle2D $ Float [x,y, W,H]。

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

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

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

    //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 :(得分:1)

previous question继续,您的基本问题归结为两个问题。

  1. 如何确定组件的更改大小
  2. 缩放图像以满足新要求。
  3. 坦率地说,这两个主题都有很多例子,你只需要将它们结合起来。你可以先看看:

    以下是我在上一个问题中提到的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既不是最快的也不是产生最佳质量的结果。上面链接的前两个示例详细介绍了其他可能的解决方案。

    您还需要计算和维护生成的缩放系数,这需要应用于任何其他绘制操作。

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