我在模糊背景上创建透明矩形时遇到问题。我正试图在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看到代码。
这是样本输出的理想图像。提前谢谢。
答案 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}}窗格,其中包含您要应用的绘图逻辑...
这是该概念的基本示例。这会在玻璃窗格上添加另一个面板,根据需要绘制面板的自定义框架。
此示例使用个人库代码,仅作为概念的示例,而非完全可运行的示例。
BlurPanel