【问题标题】:Java transparent panels & custom effect on panelsJava透明面板和面板上的自定义效果
【发布时间】:2015-04-06 08:09:50
【问题描述】:

我想在我的 GUI 中使用透明面板(如果像 Windows 7 窗口标题,那就更好了)。

在我使用com.sun.awt.AWTUtilities 之前

AWTUtilities.setWindowOpacity(frame, (float)0.90);

但它的参数是像JFrame 这样的窗口,不能用于JPanel

我还想对JPanelJLabel 产生影响,例如发光,就像在 Windows 7 标题按钮上一样。任何其他有趣的效果对我也有帮助。

【问题讨论】:

    标签: java swing user-interface jpanel transparent


    【解决方案1】:

    请参阅教程How to Create Translucent and Shaped Windows 和* How to Create Translucent and Shaped Windows*。关注@camickr 提供的优秀示例库的链接。

    例如,

    import java.awt.event.*;
    import java.awt.Color;
    import java.awt.AlphaComposite;
    import javax.swing.*;
    import javax.swing.UIManager.LookAndFeelInfo;
    
    public class ButtonTest {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new ButtonTest().createAndShowGUI();
                }
            });
        }
    
        private JFrame frame;
        private JButton opaqueButton1;
        private JButton opaqueButton2;
        private SoftJButton softButton1;
        private SoftJButton softButton2;
    
        public void createAndShowGUI() {
            opaqueButton1 = new JButton("Opaque Button");
            opaqueButton2 = new JButton("Opaque Button");
            softButton1 = new SoftJButton("Transparent Button");
            softButton2 = new SoftJButton("Transparent Button");
            opaqueButton1.setBackground(Color.GREEN);
            softButton1.setBackground(Color.GREEN);
            frame = new JFrame();
            frame.getContentPane().setLayout(new java.awt.GridLayout(2, 2, 10, 10));
            frame.add(opaqueButton1);
            frame.add(softButton1);
            frame.add(opaqueButton2);
            frame.add(softButton2);
            frame.setSize(567, 350);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
            Timer alphaChanger = new Timer(30, new ActionListener() {
    
                private float incrementer = -.03f;
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    float newAlpha = softButton1.getAlpha() + incrementer;
                    if (newAlpha < 0) {
                        newAlpha = 0;
                        incrementer = -incrementer;
                    } else if (newAlpha > 1f) {
                        newAlpha = 1f;
                        incrementer = -incrementer;
                    }
                    softButton1.setAlpha(newAlpha);
                    softButton2.setAlpha(newAlpha);
                }
            });
            alphaChanger.start();
            Timer uiChanger = new Timer(3500, new ActionListener() {
    
                private LookAndFeelInfo[] laf = UIManager.getInstalledLookAndFeels();
                private int index = 1;
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        UIManager.setLookAndFeel(laf[index].getClassName());
                        SwingUtilities.updateComponentTreeUI(frame);
                    } catch (Exception exc) {
                        exc.printStackTrace();
                    }
                    index = (index + 1) % laf.length;
                }
            });
            uiChanger.start();
        }
    
        public static class SoftJButton extends JButton {
            private static final JButton lafDeterminer = new JButton();
            private static final long serialVersionUID = 1L;
            private boolean rectangularLAF;
            private float alpha = 1f;
    
            public SoftJButton() {
                this(null, null);
            }
    
            public SoftJButton(String text) {
                this(text, null);
            }
    
            public SoftJButton(String text, Icon icon) {
                super(text, icon);
    
                setOpaque(false);
                setFocusPainted(false);
            }
    
            public float getAlpha() {
                return alpha;
            }
    
            public void setAlpha(float alpha) {
                this.alpha = alpha;
                repaint();
            }
    
            @Override
            public void paintComponent(java.awt.Graphics g) {
                java.awt.Graphics2D g2 = (java.awt.Graphics2D) g;
                g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
                if (rectangularLAF && isBackgroundSet()) {
                    Color c = getBackground();
                    g2.setColor(c);
                    g.fillRect(0, 0, getWidth(), getHeight());
                }
                super.paintComponent(g2);
            }
    
            @Override
            public void updateUI() {
                super.updateUI();
                lafDeterminer.updateUI();
                rectangularLAF = lafDeterminer.isOpaque();
            }
        }
    }
    

    【讨论】:

    【解决方案2】:

    如果您有时间,我建议您浏览此Filty Rich Clients。通过使用本书,您可以学习使用 Swing 和 Java 2D 创建令人惊叹的视觉和动画效果。学习图形和动画基础知识以及高级渲染技术。

    编辑: 创建透明面板调用

    setOpaque(false)
    

    它将绘制背景传递给它的父级,父级可能会绘制自己的背景。

    您可以进行屏幕截图,然后使用它来绘制面板的背景。

    【讨论】:

    • 不,先生!我只是想在 JPanel 上找到一些 java 视觉效果的示例代码。
    • 我知道 setOpaque()。如果你看一下我附上我的问题的图片,你可能知道我的意思是透明度,就像在 Windows 7 开始菜单中一样。谢谢你\
    猜你喜欢
    • 2011-03-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多