当前位置: 首页 > 知识库问答 >
问题:

透明JPanel

贲绪
2023-03-14

我想创建一个半透明的JPanel。我已经通过简单地使用颜色构造函数的RGBA值实现了它,但问题是当我使用事件处理时没有正确地工作。我的要求是一个半透明的Jpanel,当鼠标进入它的时候,这个面板的边框是可见的,如果鼠标退出,边框应该是不可见的。我通过下面的代码实现了这一点,但问题是它不能正常工作的透明背景(RGBA),但它可以很好地工作的RGB颜色。

import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;

public class MDCW extends JFrame {

      private JPanel contentPane;

     /**
     * Launch the application.
     */
     public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MDCW frame = new MDCW();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public MDCW() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 1013, 551);
        contentPane = new JPanel();
        contentPane.setBackground(new Color(0, 139, 139));
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        final JPanel panel = new JPanel();

        panel.setBackground(new Color(0, 0, 0,50));
        panel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                panel.setBorder(new LineBorder(new Color(255, 255, 255), 5));   
            }
            @Override
            public void mouseExited(MouseEvent e) {
                panel.setBorder(null);  
            }
        });
        panel.setBounds(360, 155, 215, 215);
        contentPane.add(panel);

        final JPanel panel_1 = new JPanel();
        panel_1.setBackground(new Color(0, 0, 0));
        panel_1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                panel_1.setBorder(new LineBorder(new Color(255, 255, 255), 5)); 
            }
            @Override
            public void mouseExited(MouseEvent e) {
                panel_1.setBorder(null);    
            }
        });
        panel_1.setBounds(84, 155, 215, 215);
        contentPane.add(panel_1);
    }
}

共有1个答案

齐元章
2023-03-14

JPanel不支持半透明背景。需要采取两个步骤来处理这个问题:

>

  • 首先,要有任何正常工作的透明度,必须在面板上setopaque(false);否则,您将有小故障,因为一个不透明的面板被认为完全覆盖了它的边界下的东西。

    但是,当opaquefalse时,面板也完全不绘制其背景(!)因此您将不得不在PaintComponent中绘制背景。

    private class TransparentPanel extends JPanel {
        {
            setOpaque(false);
        }
        public void paintComponent(Graphics g) {
            g.setColor(getBackground());
            Rectangle r = g.getClipBounds();
            g.fillRect(r.x, r.y, r.width, r.height);
            super.paintComponent(g);
        }
    }
    
    final JPanel panel = new TransparentPanel();
    

  •  类似资料:
    • 我们已经做了一些自定义动画功能用于内容过渡。强烈建议使用我们的滚动显示插件来使你的内容滚动显示。 showStaggeredList 使用它来创建一个交错的显示效果对于任何带列表项的 UL 标签。只要确定这个列表项在 UL 标签里面是 opacity: 0 再次确认动画工作是否正常。 选项名称 描述 SelectorOrEl 过渡目标的选择器或元素 fadeInImage 使用这个过渡图片,这个动

    • #klem1,#klem2 { opacity:0.4; filter:alpha(opacity=40); /* For IE8 and earlier */ } #klem1:hover,#klem2:hover { opacity:1.0; filter:alpha(opacity=100); /* For IE8 and earlier */ } div.background { widt

    • 问题内容: 是否可以使JButton透明(包括边框),但不能使文本透明?我扩展了swing的JButton并覆盖了它: 但它使包括文本在内的所有内容都透明。谢谢。 问题答案:

    • 前面在学习《 CSS颜色》时我们已经了解,通过 rgba()、hsla() 可以设置颜色的透明度,但是它们只能在定义颜色的同时设置透明度,无法对图像或者其它元素设置透明度。 CSS 中提供了一个 opacity 属性用来设置元素的透明度,它不仅对颜色有效,对图像或者页面中其它的元素也有效。其语法格式如下: opacity: number; 其中 number 为一个 0~1 之间的浮点数(小数),

    • 我有一个问题,使JComboBox透明。我尝试设置不透明为false和背景0的alpha,但它不起作用。我想我需要改变一些类,做渲染或类似的东西。这是代码...

    •     UIView有一个叫做alpha的属性来确定视图的透明度。CALayer有一个等同的属性叫做opacity,这两个属性都是影响子层级的。也就是说,如果你给一个图层设置了opacity属性,那它的子图层都会受此影响。     iOS常见的做法是把一个控件的alpha值设置为0.5(50%)以使其看上去呈现为不可用状态。对于独立的视图来说还不错,但是当一个控件有子视图的时候就有点奇怪了,图4.