在jframe中模糊背景上创建一个透明的矩形

时间:2014-04-22 09:20:06

标签: java swing graphics2d swingx glasspane

我在模糊背景上创建透明矩形时遇到问题。我正试图在glasspane上执行此任务。这是我的代码段。

void createBlur() {
    alpha = 1.0f;
    JRootPane root = SwingUtilities.getRootPane(jf);
    blurBuffer = GraphicsUtilities.createCompatibleImage(jf.getWidth(), jf.getHeight());
    Graphics2D g2d = blurBuffer.createGraphics();
    root.paint(g2d);
    g2d.dispose();

    backBuffer = blurBuffer;
    blurBuffer = GraphicsUtilities.createThumbnailFast(blurBuffer, jf.getWidth() / 2);
    blurBuffer = new GaussianBlurFilter(5).filter(blurBuffer, null);
}

其中,backBuffer和blurBuffer是BufferedImage&的对象。 jf = JFrame,alpha用于不透明度。 上面的方法很好地创建了一个模糊效果。

以下是在Panel

上创建透明矩形的代码
protected void paintComponent(Graphics g) {
    int x = 34;
    int y = 34;
    int w = getWidth() - 68;
    int h = getHeight() - 68;
    int arc = 30;

    //Graphics2D g2 = currentGraphics.createGraphics();
    //g2.drawImage(currentGraphics, 0, 0, null);
    Graphics2D g2 = (Graphics2D) g.create();
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    g2.setColor(new Color(0, 0, 0, 220));
    g2.fillRoundRect(x, y, w, h, arc, arc);

    g2.setStroke(new BasicStroke(1f));
    g2.setColor(Color.WHITE);
    g2.drawRoundRect(x, y, w, h, arc, arc);

    g2.dispose();
}

现在我卡住的是如何同时绘制模糊效果和透明矩形。 我没有在这里发布完整的代码,如果有人希望在link看到代码。

这是样本输出的理想图像。提前谢谢。

enter image description here

1 个答案:

答案 0 :(得分:2)

我试图为你的代码做好准备......

您未能致电super.paintComponent ...如果您不小心,这可能会导致您遇到同样严重的问题。一般经验法则,只需称之为;)

修改Graphics上下文的状态时要小心,例如......

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

会影响在此之后绘制的所有组件,并且可能会导致一些您不期待的有趣的图形故障...

jf.getGlassPane().setVisible(false);
glassPanel = new GlassPanel();
jf.getGlassPane().setVisible(true);

似乎毫无意义,因为使用jf.setGlassPane(glassPanel);设置的组件仍然是调用jf.getGlassPane().setVisible(true);时可见的组件。这也意味着永远不会使用GlassPane组件...

检查isVisible中的paintComponent是没有意义的,因为Swing足够聪明,知道不要绘制不可见的组件......

现在,说了这么多......

如果你想在BlurPanel之上绘画,你可以...在绘制blurBuffer之后绘制内容,这样你就可以在其上绘制或者在{{{{}}上添加另一个组件1}}窗格,其中包含您要应用的绘图逻辑...

这是该概念的基本示例。这会在玻璃窗格上添加另一个面板,根据需要绘制面板的自定义框架。

此示例使用个人库代码,仅作为概念的示例,而非完全可运行的示例。

Before After

BlurPanel