Stratificazione di più GlassPane in un contenitore radice

È ansible aggiungere più GlassPane per un singolo JFrame , oppure devo usare il LayeredPane scomodo con l’attributo Opacity .

Ho allegato un codice che mostra cosa voglio fare (fornito da @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 actionPerformsd(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 actionPerformsd(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(); } }); } } 

Guardare http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html per una spiegazione sui riquadri della radice e su cosa sia effettivamente il pannello di vetro.

Il pannello di vetro è solo un modo conveniente per aggiungere un componente che ha le dimensioni del riquadro principale e che blocca tutti gli eventi di input. Ciò consente di intercettare qualsiasi interazione con i componenti per creare una schermata “Attendere …”.

C’è solo un singolo riquadro di vetro per ogni contenitore radice. Non puoi stratificare i vetri .

Puoi sostituire il contenuto del pannello di vetro con qualcos’altro se vuoi sovrapporre qualcosa al pannello di vetro corrente. È inoltre ansible impostare un JPanel come riquadro di vetro, che consente di impaginare più componenti nel riquadro di vetro.

Solitamente, si dovrebbe usare solo il pannello di vetro per bloccare l’input dell’utente (e, se necessario, visualizzare una sorta di messaggio “please wait”). Potete fornire un caso d’uso del perché volete mettere i pannelli di vetro uno sopra l’altro?