多くの答えが見つかった画像に 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 に完全に印刷します (フレームの境界は無視します)。フレームのすべてのコンポーネントでそれを行いたいです。