Colocando vários GlassPane’s em um container raiz

É possível adicionar vários GlassPane s para um único JFrame , ou eu tenho que usar o desconfortável LayeredPane com o atributo Opacity .

Anexei algum código que mostra o que quero fazer (fornecido por @camickr).

 import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.border.*; public class MultiplayGlassPane { private static final long serialVersionUID = 1L; private JFrame frame = new JFrame("frameTitle"); private JPanel fPanel = new JPanel(); private Random random = new Random(); private final static Border MESSAGE_BORDER = new EmptyBorder(10, 10, 10, 10); private JLabel message = new JLabel(); private ArrayList stars = new ArrayList(); public MultiplayGlassPane() { MyGlassPane glass = new MyGlassPane(); for (int i = 0; i < 35; i++) { Star star = new Star(new Point(random.nextInt(580), random.nextInt(550))); star.setColor(Color.orange); star.setxIncr(-3 + random.nextInt(7)); star.setyIncr(-3 + random.nextInt(7)); glass.add(star); } frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(glass, BorderLayout.CENTER); frame.setLocation(20, 20); frame.pack(); frame.setVisible(true); DisabledGlassPane1 glassPane = new DisabledGlassPane1(); JRootPane rootPane = SwingUtilities.getRootPane(frame); rootPane.setGlassPane(glassPane); glassPane.activate(""); } private class MyGlassPane extends JLabel { private static final long serialVersionUID = 1L; private ArrayList stars = new ArrayList(); private javax.swing.Timer timer = new javax.swing.Timer(20, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (Star star : stars) { star.move(); } repaint(); } }); public void stopAnimation() { if (timer.isRunning()) { timer.stop(); } } public void startAnimation() { if (!timer.isRunning()) { timer.start(); } } @Override public void addNotify() { super.addNotify(); timer.start(); } @Override public void removeNotify() { super.removeNotify(); timer.stop(); } @Override public Dimension getPreferredSize() { return new Dimension(new Dimension(620, 620)); } public MyGlassPane() { this.setPreferredSize(new Dimension(620, 620)); } public void add(Star star) { stars.add(star); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); for (Star star : stars) { g.setColor(star.getColor()); g.fillPolygon(star); } } } class DisabledGlassPane1 extends JComponent implements KeyListener { private static final long serialVersionUID = 1L; public DisabledGlassPane1() { setOpaque(false); Color base = UIManager.getColor("inactiveCaptionBorder"); Color background = new Color(base.getRed(), base.getGreen(), base.getBlue(), 128); setBackground(background); setLayout(new GridBagLayout()); add(message, new GridBagConstraints()); message.setOpaque(true); message.setBorder(MESSAGE_BORDER); addMouseListener(new MouseAdapter() { }); addMouseMotionListener(new MouseMotionAdapter() { }); addKeyListener(this); setFocusTraversalKeysEnabled(false); Random random = new Random(); for (int i = 0; i  0) { message.setVisible(true); message.setText(text); message.setForeground(getForeground()); } else { message.setVisible(false); } setVisible(true); //setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); requestFocusInWindow(); } public void deactivate() { setCursor(null); setVisible(false); } private javax.swing.Timer timer = new javax.swing.Timer(15, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (Star star : stars) { star.move(); } repaint(); } }); public void stopAnimation() { if (timer.isRunning()) { timer.stop(); } } public void startAnimation() { if (!timer.isRunning()) { timer.start(); } } @Override public void addNotify() { super.addNotify(); timer.start(); } @Override public void removeNotify() { super.removeNotify(); timer.stop(); } public void add(Star star) { stars.add(star); } } private class Star extends Polygon { private static final long serialVersionUID = 1L; private Point location = null; private Color color = Color.YELLOW; private int xIncr, yIncr; static final int WIDTH = 600, HEIGHT = 600; Star(Point location) { int x = location.x; int y = location.y; this.location = location; this.addPoint(x, y + 8); this.addPoint(x + 8, y + 8); this.addPoint(x + 11, y); this.addPoint(x + 14, y + 8); this.addPoint(x + 22, y + 8); this.addPoint(x + 17, y + 12); this.addPoint(x + 21, y + 20); this.addPoint(x + 11, y + 14); this.addPoint(x + 3, y + 20); this.addPoint(x + 6, y + 12); } public void setColor(Color color) { this.color = color; } public void move() { if (location.x  frame.getContentPane().getWidth() - 20) { xIncr = -xIncr; } if (location.y  frame.getContentPane().getHeight() - 20) { yIncr = -yIncr; } translate(xIncr, yIncr); location.setLocation(location.x + xIncr, location.y + yIncr); } public void setxIncr(int xIncr) { this.xIncr = xIncr; } public void setyIncr(int yIncr) { this.yIncr = yIncr; } public Color getColor() { return color; } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { MultiplayGlassPane Mpgp = new MultiplayGlassPane(); } }); } } 

Consulte http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html para obter uma explicação sobre os painéis raiz e o que realmente é o painel Glass.

O painel de vidro é apenas uma maneira conveniente de adicionar um componente que tenha o tamanho do Painel Raiz e bloqueie todos os events de input. Isso permite que você capture qualquer interação com seus componentes para criar uma canvas “Aguarde por favor …”.

Há apenas um único painel de vidro por contêiner raiz. Você não pode colocar painéis de vidro .

Você pode replace o conteúdo do painel de vidro por outra coisa, se quiser colocar algo sobre o painel de vidro atual. Você também pode definir um JPanel como um painel de vidro, que permite o layout de vários componentes no painel de vidro.

Normalmente, você só deve usar o painel de vidro para bloquear a input do usuário (e, se necessário, exibir algum tipo de mensagem “por favor aguarde”). Você pode fornecer um caso de uso de por que você quer colocar placas de vidro em cima uns dos outros?