java,的组件如何将java的组件的背景设置透明?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java,的组件如何将java的组件的背景设置透明?相关的知识,希望对你有一定的参考价值。

我是新手.我在做个游戏,我把一个Panel放置到了主场景中(一个Frame),但是Panel的背景色去不掉.怎么样才能去掉呢?(Alphacmposite好像不能控制组件的alpha)

java swing中将组件的背景设置成透明的示例如下:


import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.*;
public class Talpha 
        /**
         * @param args
         */
        public static void main(String[] args) 
                // TODO Auto-generated method stub
                final Display display = new Display();
                final Shell shell = new Shell(display);
                shell.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
                Canvas canvas = new Canvas(shell, SWT.NO_BACKGROUND);
                //使用paintlistener,保证每次均重新绘制。
                canvas.addPaintListener(new PaintListener() 
                        public void paintControl(PaintEvent e) 
                                GC gc = e.gc;
                        //读图像
                        ImageData imageData = new ImageData("1.jpg");
                                 //这里是建立从左到右的渐进Alpha。
                   byte[] alphaValues = new byte[imageData.height * imageData.width];
                                for (int j = 0; j < imageData.height; j++) 
                                        for (int i = 0; i < imageData.width; i++) 
                              alphaValues[j * imageData.width + i] = (byte) (255 - 255
                                                                * i / imageData.width);
                                        
                                
                                imageData.alphaData = alphaValues;
                                Image image = new Image(display, imageData);
                         //绘制                               
                        gc.drawImage(image,0,0);//关键点是这里设置背景颜色
                        
                );
                FillLayout fillLayout = new FillLayout();
                fillLayout.type = SWT.VERTICAL;
                shell.setLayout(fillLayout);
                shell.setSize(200, 600);
                shell.open();
                while (!shell.isDisposed()) 
                        if (!display.readAndDispatch())
                                display.sleep();
                
                display.dispose();
        
参考技术A java
swing中将组件的背景设置成透明的示例如下:
import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.*;
public class Talpha
/**
* @param args
*/
public static void main(String[] args)
// TODO Auto-generated method stub
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
Canvas canvas = new Canvas(shell, SWT.NO_BACKGROUND);
//使用paintlistener,保证每次均重新绘制。
canvas.addPaintListener(new PaintListener()
public void paintControl(PaintEvent e)
GC gc = e.gc;
//读图像
ImageData imageData = new ImageData("1.jpg");
//这里是建立从左到右的渐进Alpha。
byte[] alphaValues = new byte[imageData.height * imageData.width];
for (int j = 0; j < imageData.height; j++)
for (int i = 0; i < imageData.width; i++)
alphaValues[j * imageData.width + i] = (byte) (255 - 255
* i / imageData.width);


imageData.alphaData = alphaValues;
Image image = new Image(display, imageData);
//绘制
gc.drawImage(image,0,0);//关键点是这里设置背景颜色

);
FillLayout fillLayout = new FillLayout();
fillLayout.type = SWT.VERTICAL;
shell.setLayout(fillLayout);
shell.setSize(200, 600);
shell.open();
while (!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();

display.dispose();

参考技术B 我觉得你的思路错了,

做游戏要大量用到图像重绘技术,

所以你需要的是canvas,而不是panel.

你去学学canvas控件,会发现它的强大.

还有,给你个参考,
在jdk安装目录下面有这样的文件结构
jdk1.6.0_13\demo\jfc\Java2D\Java2Demo.jar

你运行那个java2dDemo.jar试试看,

它会给你许多启发!本回答被提问者采纳
参考技术C 直接删除

Java Swing - 半透明组件

【中文标题】Java Swing - 半透明组件【英文标题】:Java Swing - Translucent Components 【发布时间】:2011-06-26 08:38:24 【问题描述】:

我最近问了一个关于半透明组件的问题,该组件导致奇怪的伪影似乎无法正确更新。我收到的答案导致工件消失,但以半透明为代价。

解决方案是对每个半透明组件也调用 setOpaque(false) 函数。这样,Swing 就知道它需要重新绘制这些组件背后的背景。

但是,这是以我试图实现的半透明为代价的。它导致组件变得透明。

前提是:我正在为聊天客户端设计GUI,功能要求是要有背景。我通过遵循用于扩展 JPanel 类的代码 sn-p 成功地使背景工作,但后来我希望组件允许背景显示。设置半透明后,更新组件的残余部分显示在不应出现的位置。我来到这里并解决了我的问题,但现在我遇到了一个新问题。所以我们到了。

所以,这是我的推测:

-为每个所需组件调用 setOpaque(false) 函数而不设置半透明颜色并不能达到我想要的效果。

-设置半透明颜色而不调用 setOpaque(false) 可以显示半透明背景,但会导致伪影,让我回到第一格。

所以我需要在没有伪影的透明和有伪影的半透明之间找到一个中间地带。也就是说,我想要一个没有伪影的半透明背景(不完全透明)。

似乎我需要重写 JFrame 以使其重新绘制其所有组件,而不管不透明度如何。除非有什么我错过了……这就是我在这里的原因!

谢谢!

(这里是原问题的链接,附图片供参考:Java Swing - Translucent Components causing Artifacts)

【问题讨论】:

【参考方案1】:

一种选择是覆盖组件并自己绘制背景:

class TranslucentLabel extends JLabel 
    public TranslucentLabel(String text) 
        super(text);
        setOpaque(false);
    

    @Override
    public void paintComponent(Graphics g) 
        g.setColor(new Color(255, 0, 0, 64));
        Insets insets = getInsets();
        g.fillRect(insets.left, insets.top, 
                getWidth() - insets.left - insets.right, 
                getHeight() - insets.top - insets.bottom);
        super.paintComponent(g);
    

编辑:或者,您可以将子组件的半透明背景颜色直接绘制到面板上,然后您不必覆盖组件:

class YourPanel extends JPanel 
    @Override
    protected void paintComponent(Graphics g) 
        Graphics2D g2d = (Graphics2D)g.create();

        // Draw your background image here to g2d.

        g2d.setColor(new Color(255, 0, 0, 64));
        Area area = new Area();
        for (Component component : getComponents()) 
            area.add(new Area(component.getBounds()));
        
        g2d.fill(area);
        g2d.dispose();
    

这种方法有一个缺点。如果组件有真正透明的部分(例如圆形边框),那么它的整个背景都会被着色。

【讨论】:

我已经覆盖了 JPanel 类以允许自定义背景。带有背景的 JPanel 是我框架的内容窗格。无论如何添加到覆盖的 JPanel 并强制不透明组件重绘会更好吗?这样我就不必覆盖我正在使用的所有组件。 我添加了一种替代方法,尽管它可能并不理想。 嘿,它有效! img408.imageshack.us/img408/186/help3i.png 非常感谢您的帮助。我不应该有任何圆角要处理,真的,所以这一切都很好。如果我这样做了,for 循环上的一点选择性会很适合我,很可能。

以上是关于java,的组件如何将java的组件的背景设置透明?的主要内容,如果未能解决你的问题,请参考以下文章

Java Swing - 为所有子组件设置不透明度?

java窗口的背景颜色

java 图片背景怎样设置成透明

Element组件库Table表格样式设置背景半透明

设置不透明(真/假);爪哇

QQuickWidget+QML设置背景透明