0

我正在尝试对透明进行双重缓冲,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);
    }

}
4

1 回答 1

1

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

有关更多详细信息,请参阅在 AWT 中绘画和 Swing执行自定义绘画

您面临的一个直接问题是 Swing 窗口已经附加了一系列复合组件(JRootPane,contentPane等),所有这些组件都可以独立于您的窗口进行绘制,这意味着它们可以覆盖每个您'一直试图直接在窗户上画画。相反,请避免直接在窗口上绘画,而是使用自定义组件。

于 2015-08-20T07:42:45.760 回答