自分でバック バッファーとして実装する必要Image
がありますか、またはバック バッファーをアクティブにするためのコンポーネントまたはオプションが既に作成されていますか?
私の目標は、ウィンドウの移動と非表示/表示時に図面を保持することです...
アップデート
JPanel を使用しようとしたので、バッファがあれば動作するはずですが、失敗しました:
final JPanel panel = new JPanel();
panel.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
Graphics2D g2d = (Graphics2D) panel.getGraphics();
g2d.drawOval(e.getX()-50, e.getY()-50, 100, 100);
}
});
JFrame frame = new JFrame("JPanel Buffer Test");
frame.add(panel, BorderLayout.CENTER);
frame.pack();
frame.setBounds(100,100, 800, 600);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
ここでは、マウス クリックで円が描画されますが、ウィンドウのサイズを変更すると消えます。したがって、明らかにバッファは存在しません。
コンポーネントにバッファがある場合、その上に何かを描画でき、サイズ変更しても保持されます。
JPanel
のバッファにアクセスする方法があるかもしれgetGraphics
ません。
更新 2
以下は、手動でバッファリングした方法です。私の質問は、図書館ですでに行われていないということです。例では、サイズ変更時にバッファーをリサンプリングしますが、これは必須ではありません。
private BufferedImage bufferedImage = null;
@Override
protected void paintComponent(Graphics g) {
if( bufferedImage != null ) {
g.drawImage(bufferedImage, 0, 0, null);
}
}
@Override
public void setBounds(int x, int y, int width, int height) {
if( bufferedImage == null ) {
bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
}
else {
if( bufferedImage.getWidth() != width || bufferedImage.getHeight() != height ) {
BufferedImage scaledImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
AffineTransform at = new AffineTransform();
at.scale((double)width/bufferedImage.getWidth(), (double)height/bufferedImage.getHeight());
AffineTransformOp scaleOp =
new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
bufferedImage = scaleOp.filter(bufferedImage, scaledImage);
}
}
super.setBounds(x, y, width, height);
}
public Graphics2D createImageGraphics() {
if( bufferedImage != null ) {
return bufferedImage.createGraphics();
}
else {
return null;
}
}