gpt4 book ai didi

java - 使用 JWindow 进行双缓冲

转载 作者:行者123 更新时间:2023-12-01 11:13:30 25 4
gpt4 key购买 nike

我正在尝试对透明的JWindow进行双缓冲,但似乎所使用的技术不起作用(不同的周期值相互重叠)。

public final class Overlay extends JWindow {

public static final Color TRANSPARENT = new Color(0, true);
public static Font standardFont = null;

public static Overlay open() {
return new Overlay();
}

private Overlay() {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setAlwaysOnTop(true);
setBounds(0, 0, screenSize.width, screenSize.height);
setBackground(TRANSPARENT);
}

@Override
public void paint(Graphics g) {
BufferedImage bufferedImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2d = bufferedImage.createGraphics();
paintUs(g2d);

Graphics2D g2dComponent = (Graphics2D) g;
g2dComponent.drawImage(bufferedImage, null, 0, 0);
}

private void paintUs(Graphics2D g) {
int height = 420;
int x = 20;
g.setColor(TRANSPARENT);
g.fillRect(0, 0, getWidth(), getHeight());
g.setFont(standardFont == null ? standardFont = g.getFont().deriveFont(17f) : standardFont);
for (Plugin plugin : Abendigo.plugins()) {
g.setColor(Abendigo.plugins().isEnabled(plugin) ? Color.GREEN : Color.RED);
g.drawString(plugin.toString(), x + 5, getHeight() - height);
height += 20;
}
height += 20;
g.setColor(Color.YELLOW);
g.drawString("Cycle: " + Abendigo.elapsed + "ms", x, getHeight() - height);
}

@Override
public void update(Graphics g) {
paint(g);
}

}

最佳答案

为什么!!!? Swing 组件已经是双缓冲了吗?简单地创建一个自定义组件,从 JPanel 等扩展,覆盖它的 paintComponent 并在那里执行自定义绘制。确保将组件设置为透明 (setOpaque(false)) 并将其添加到 JWindow

的实例中

参见Painting in AWT and SwingPerforming Custom Painting了解更多详情。

您面临的直接问题之一是 Swing 窗口已经附加了一系列复合组件(JRootPanecontentPane 等),所有其中可以独立于窗口进行绘制,这意味着它们可以覆盖您尝试直接在窗口上绘制的内容。相反,请避免直接绘制到窗口并使用自定义组件。

关于java - 使用 JWindow 进行双缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32112285/

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