我一直在寻找一种将 JSwing 组件绘制到我找到许多答案的图像的方法。我还没有找到以忽略当前窗口大小并将自身打印到完全首选大小的图像的方式来绘制组件的方法。
我在可调整大小的框架中有组件。缩小后,一些组件被裁剪。不管怎样,我想要的是将此帧绘制成首选尺寸的图像。
BufferedImage img = new BufferedImage(getPreferredSize().width,
getPreferredSize().height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = img.createGraphics();
this.printAll(g);
这会产生在调整大小的窗口上看到的图像,但我希望它自己绘制,就像它有足够的首选空间一样,无论窗口或计算机屏幕大小如何。
已编辑。
这是SSCCE:
import java.awt.BorderLayout;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Test extends JFrame {
private static final long serialVersionUID = 1L;
public Test() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(100, 100);
JLabel lbl = new JLabel("Long text. Long text. Long text. Long text.");
JPanel panel = new JPanel();
panel.add(lbl);
JButton btn = new JButton("Screenshot");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
BufferedImage img = new BufferedImage(getPreferredSize().width,
getPreferredSize().height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = img.createGraphics();
printAll(g);
try {
ImageIO.write(img, "jpeg", new File("image.jpg"));
} catch (IOException ex) {
}
}
});
getContentPane().setLayout(new BorderLayout());
getContentPane().add(panel, BorderLayout.CENTER);
getContentPane().add(btn, BorderLayout.PAGE_START);
}
public static void main(String[] args) {
Test t = new Test();
t.setVisible(true);
}
}
这将创建一个带有按钮和标签的小窗口,该标签太长而无法完全显示。按钮按原样截取屏幕截图。我想要的是一个 image.jpg,它在按钮和标签上具有完全可见的文本,就好像框架足够大以容纳它们一样。
如果我这样做:
Graphics2D g = img.createGraphics();
lbl.printAll(g); // instead of printAll(g);
我将标签完全打印到 image.jpg (忽略帧边界)。我想用框架的所有组件来做到这一点。