Java透明面板和面板上的自定义效果

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

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

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

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

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

在此处输入图像描述

请参阅教程如何创建半透明和形状的Windows和* 如何创建半透明和形状的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(); } } } 

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

编辑:创建透明面板调用

 setOpaque(false) 

它会将背景绘制为其父级,这可能会绘制自己的背景。

您可以执行屏幕捕获,然后使用它来绘制面板的背景。