小编Nis*_*s36的帖子

在BufferedImage上绘制具有不透明度的圆角矩形

我一直在尝试为我正在开发的小游戏实现基本文本泡泡.不想过于花哨,我开始使用一个基本的圆角矩形,边框包含一些文字:
基本文字泡泡

然后,我决定文本气泡应该在预设时间后淡出.这就是我偶然发现问题的地方:当我试图在测试窗口中显示气泡时,一切正常,但是当我在游戏中显示它们时,当气泡消失时会出现失真.我测试了一些,调试了,发现两种情况之间的唯一区别是在测试窗口我使用paintComponent方法的Graphics绘制了气泡,而在游戏中我使用BufferedImages来模拟图层并使用来自image.createGraphics的图形.然后我可以成功复制错误:
显示错误的Gif

在这里,您可以看到当左边的气泡褪色时,与褪色前相比,它的圆角会改变形状,而右边圆角上的气泡不会改变.实际上,左边的气泡是在BufferedImage上绘制的,然后在面板上绘制,而右边的气泡直接在面板上绘制.
我已经隔离了重现问题所需的代码:

public static void main(String[] args) {

    JFrame frame = new JFrame("Test");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setSize(400, 400);

    JPanel panel = new JPanel() {

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            BufferedImage image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
            Graphics graphics = image.createGraphics();

            paintExampleBubble(graphics, 50, 50);

            g.drawImage(image, 0, 0, this);

            paintExampleBubble(g, 250, 50);
        }
    };

    frame.getContentPane().add(panel);
    frame.setVisible(true);
}

private static final Color background = new Color(1f, 1f, 1f, 0.5f);
private static final Color foreground = new Color(0f, 0f, 0f, 0.5f); …
Run Code Online (Sandbox Code Playgroud)

java swing transparency paintcomponent

7
推荐指数
1
解决办法
452
查看次数

标签 统计

java ×1

paintcomponent ×1

swing ×1

transparency ×1