gpt4 book ai didi

java - 自定义 Swing 组件的图像缓冲区?

转载 作者:行者123 更新时间:2023-11-30 09:29:10 25 4
gpt4 key购买 nike

我应该自己实现 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);

这里的圆圈是在鼠标点击时绘制的,但在窗口调整大小时会消失。因此,显然不存在缓冲区。

如果组件有缓冲区,我可以在上面画一些东西,它会在调整大小时保持不变。

除了 getGraphics 之外,是否还有其他方法可以访问 JPanel 的缓冲区?

更新 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;
}
}

最佳答案

您只需要一个JPanel,默认情况下它自动是双缓冲(更多信息请参见here),您可以简单地覆盖paintComponent (..) 并在那里进行所有绘图,然后将 JPanel 添加到 JFrame 之类的容器中。

查看更多信息:

您可能还想完全控制 JPanel 的重绘周期,这可以通过调用 setIgnoreRepaint(true) 来完成。

或者你可能想看看BufferStrategy and BufferCapabilities (这将允许您使用一些高级功能,但用于所有密集用途的 JPanel 覆盖 paintComponent 和自动 double bufferingsetIgnoreRepaint(true) 是等效的),这通常用 Canvas 实现,如下所示:

BufferStrategy myStrategy;

while (!done) {
Graphics g = myStrategy.getDrawGraphics();
render(g);//draw the frame/graphics
g.dispose();
myStrategy.show();
}

关于java - 自定义 Swing 组件的图像缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13722480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com