动态调整大小 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。
继续你的,你的基本问题归结为两个问题。
- 如何确定组件何时更改大小
- 缩放图像以满足新要求。
坦率地说,这两个主题都有很多可用的示例,您只需要将它们结合起来即可。您可以先看看:
- 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
来应用它,但这一切都归结为需要
正如这个问题 (
提供的解决方案确实为我的图像尺寸构建了一个 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。
继续你的
- 如何确定组件何时更改大小
- 缩放图像以满足新要求。
坦率地说,这两个主题都有很多可用的示例,您只需要将它们结合起来即可。您可以先看看:
- 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
来应用它,但这一切都归结为需要