简体   繁体   English

如何在完全透明的JFrame上创建部分透明的JButton?

[英]How to create partly transparent JButton on fully transparent JFrame?

I am able to make JFrame totally transparent and the JButton is partly transparent just fine until I move my mouse on the button ( do not click ) and move the mouse off from the button ( MouseExited called via MouseListener ). 我能够使JFrame完全透明,JButton部分透明,直到我在按钮上移动鼠标(不要单击)并从按钮移开鼠标(通过MouseListener调用MouseExited)。 What happens is that the background of the JButton is drawn again, so after couple of mouse movements on and off the button the button is totally opaque. 会发生什么是JButton的背景再次被绘制,所以在按钮上打开和关闭几个鼠标后,按钮完全不透明。

public class ButtonExample extends JWindow
{
   public ButtonExample( )
   {
        JButton But = new JButton( "Testing" );
        But.setBackground( new Color( 0, 0, 0, 200 ) );
        But.setForeground( new Color( 70, 155, 255 ) );
        this.add( But );
        this.setBackground( new Color( 0, 0, 0, 0 ) );
        this.setMinimumSize( new Dimension( 200,100 ) );
        this.setVisible( true );
    }

    public static void main( String[ ] Args ) 
    {
        new ButtonExample( );
    }
}

problem is that the button reports being fully opaque when in fact it isn't (due to the partially transparent color) 问题是按钮报告完全不透明,实际上它不是(由于部分透明的颜色)

  but.setOpaque(false);

BTW: as you see I changed the field name to conform to java naming conventions :-) BTW:如你所见,我改变了字段名称以符合java命名约定:-)

Edit 编辑

arggghh .. missed that, sorry. arggghh ..错过了,对不起。 Need to check what we do in SwingX, from the top of my head I would say you need to override paintComponent and handle the background painting yourself, like 需要检查我们在SwingX中做什么,从头顶我会说你需要覆盖paintComponent并自己处理背景画,比如

        /** 
         * @inherited <p>
         */
        @Override
        protected void paintComponent(Graphics g) {
            if (!isOpaque() && getBackground().getAlpha() < 255) {
                g.setColor(getBackground());
                g.fillRect(0, 0, getWidth(), getHeight());
            }
            super.paintComponent(g);
        }

didn't try, though, maybe the "getting more opaque" is back again with doing so .. will come back tomorrow 但是,没有尝试,也许“变得越来越不透明”又回来了。明天会回来

Edit 2 编辑2

okay, checked - the edited code works correctly. 好的,检查 - 编辑的代码正常工作。 So in summary: components with translucent background 总结:具有半透明背景的组件

  • must report that they are not opaque to not confuse the default painting mechanism 必须报告它们不是不透明的,不要混淆默认的绘画机制
  • must take over the background painting and fill it with the background color themselves (SwingX JXPanel fi does by explicit support for an alpha property) 必须接管背景绘画并用背景颜色填充它(SwingX JXPanel fi通过显式支持alpha属性)

for your convenience, here's a small runnable with incorrect/correct background side-by-side 为了您的方便,这里是一个小型的可运行的,并排不正确/正确的背景

public class TransparentButton  {

    public TransparentButton() {
        JWindow incorrectOpaque = createWindow("incorrect opaque", true);
        incorrectOpaque.setLocation(600, 600);
        incorrectOpaque.setVisible(true);
        JWindow correctOpaque = createWindow("correct opaque", false);
        correctOpaque.setLocation(800, 600);
        correctOpaque.setVisible(true);
    }


    private JButton createButton(final boolean opaque) {
        JButton but = new JButton("Testing") {

            /**
             * @inherited <p>
             * Overridden to take over background painting with 
             * transparent color.
             */
            @Override
            protected void paintComponent(Graphics g) {
                if (!isOpaque() && getBackground().getAlpha() < 255) {
                    g.setColor(getBackground());
                    g.fillRect(0, 0, getWidth(), getHeight());
                }
                super.paintComponent(g);
            }

        };
        but.setBackground(new Color(0, 0, 0, 100));
        but.setForeground(new Color(70, 155, 255));
        but.setOpaque(opaque);
        return but;
    }

    private JWindow createWindow(String text, boolean opaque) {
        JWindow window = new JWindow();
        JButton but = createButton(opaque);
        window.add(but);
        window.add(new JLabel(""), BorderLayout.SOUTH);
        window.setOpacity(0.5f);
        window.setBackground(new Color(0, 0, 0, 0));
        window.setSize(new Dimension(200, 100));
        return window;
    }

    public static void main(String[] Args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {

                new TransparentButton();
            }
        });
    }

    @SuppressWarnings("unused")
    private static final Logger LOG = Logger.getLogger(TransparentButton.class
            .getName());
}

Have you tried translucency ? 你试过半透明吗?

The translucent and shaped window API was first added to the Java SE 6 Update 10 release as a private API. 半透明和整形窗口API首次作为私有API添加到Java SE 6 Update 10发行版中。 This functionality was moved to the public AWT package in the JDK 7 release. 此功能已移至JDK 7发行版中的公共AWT包。

I think the above links may help you. 我认为以上链接可能会对您有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM