Display a message on the screen

前端 未结 3 529
说谎
说谎 2021-01-17 08:48

I would like to display a message onto the screen upon the button press. The message should not have any window and should be displayed at the center of the screen over any

3条回答
  •  陌清茗
    陌清茗 (楼主)
    2021-01-17 09:18

    I can think of at least three ways to do this in Swing...

    GlassPane

    If you simply want to show content over the current frame, then you can use the current frames glass pane...

    GlassPane

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Font;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class OverlayTest {
    
        public static void main(String[] args) {
            new OverlayTest();
        }
    
        public OverlayTest() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
                
                    final OverlayPane overlay = new OverlayPane();
                    JButton show = new JButton("Show");
                    show.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            overlay.setVisible(true);
                        }
                    });
                
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setGlassPane(overlay);
                    frame.setLayout(new GridBagLayout());
                    frame.add(show);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class OverlayPane extends JPanel {
        
            private JLabel label;
        
            public OverlayPane() {
                setLayout(new GridBagLayout());
                label = new JLabel("1");
                label.setFont(label.getFont().deriveFont(Font.BOLD, 96f));
                add(label);
                setOpaque(false);
            }
        
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 200);
            }
        
        }
    
    }
    

    See how to use How to Use Root Panes

    JLayedPane

    If you want to display the content over a particular component within the current frame, then you could take advantage of the JLayeredPane, which acts a lot like a glass pane for components...

    See How to Decorate Components with the JLayer Class for more details

    Undecorated Frame

    Transparent Frame

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Font;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class OverlayTest2 {
    
        public static void main(String[] args) {
            new OverlayTest2();
        }
    
        public OverlayTest2() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    final JFrame masterFrame = new JFrame("Testing");
    
                    final OverlayPane overlay = new OverlayPane();
                    JButton show = new JButton("Show");
                    show.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
    
                            JFrame frame = new JFrame();
                            frame.setUndecorated(true);
                            frame.setBackground(new Color(0, 0, 0, 0));
                            frame.add(new OverlayPane());
                            frame.pack();
                            frame.setLocationRelativeTo(masterFrame);
                            frame.setVisible(true);
    
                        }
                    });
    
                    masterFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    masterFrame.setGlassPane(overlay);
                    masterFrame.setLayout(new GridBagLayout());
                    masterFrame.add(show);
                    masterFrame.pack();
                    masterFrame.setLocationRelativeTo(null);
                    masterFrame.setVisible(true);
                }
            });
        }
    
        public class OverlayPane extends JPanel {
    
            private JLabel label;
    
            public OverlayPane() {
                setLayout(new GridBagLayout());
                label = new JLabel("1");
                label.setFont(label.getFont().deriveFont(Font.BOLD, 96f));
                add(label);
                setOpaque(false);
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 200);
            }
    
        }
    
    }
    

    See How to Create Translucent and Shaped Windows

    Now, if you want the window be filled, then remove the line frame.setBackground(new Color(0, 0, 0, 0));, this is what makes the frame transparent.

提交回复
热议问题