java - 在根容器中分层多个 GlassPane

标签 java swing jframe glasspane

是否可以为单个 JFrame 添加多个 GlassPane,或者我必须使用不舒服的 LayeredPane不透明度 属性。

我附上了一些显示我想做什么的代码(由@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<Star> stars = new ArrayList<Star>();

    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<Star> stars = new ArrayList<Star>();
        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 < 50; i++) {
                Star star = new Star(new Point(random.nextInt(490), random.nextInt(490)));
                star.setColor(Color.magenta);
                star.setxIncr(-3 + random.nextInt(7));
                star.setyIncr(-3 + random.nextInt(7));
                add(star);
            }
        }

        @Override
        protected 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);
            }
        }

        @Override
        public void setBackground(Color background) {
            super.setBackground(background);
            Color messageBackground = new Color(background.getRGB());
            message.setBackground(messageBackground);
        }

        public void keyPressed(KeyEvent e) {
            e.consume();
        }

        public void keyTyped(KeyEvent e) {
        }

        public void keyReleased(KeyEvent e) {
            e.consume();
        }

        public void activate(String text) {
            if (text != null && text.length() > 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 < 0 || location.x > frame.getContentPane().getWidth() - 20) {
                xIncr = -xIncr;
            }
            if (location.y < 0 || 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();
            }
        });
    }
}

最佳答案

http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html有关根 Pane 的解释以及 Glass Pane 的实际含义。

玻璃 Pane 只是一种添加组件的便捷方式,它具有根 Pane 的大小,并且阻止所有输入事件。这使您可以捕获与组件的任何交互以创建“请稍候...”屏幕。

每个根容器只有一个玻璃 Pane 。 您不能将玻璃板分层

如果你想在当前玻璃面板上叠加一些东西,你可以用其他东西替换玻璃面板的内容。您还可以将 JPanel 设置为玻璃 Pane ,这允许您在玻璃 Pane 中布局多个组件。

通常,您应该只使用玻璃 Pane 来阻止用户输入(并且,如果需要,显示某种“请稍候”消息)。您能否提供一个用例,说明为什么要将玻璃板彼此叠放?

关于java - 在根容器中分层多个 GlassPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8715807/

相关文章:

java - 如何在 Java Swing 上制作 Youtube 的旋转加载屏幕

java - javax.swing.JFrame不包含setDefaultCLoseOperation

Java awt Swing - 我遇到错误了吗?

java - 如何在小程序中使用2个面板?

java - 在 Netbeans 中从 JFrame 到 JPanel

java - PdfBox - 使用获取字体信息

框架内的JAVA按钮生成图表

java - 为什么我的坐标与 JFrame 大小不匹配?

java - 单例实现示例

java - react 链中 next() 的奇怪行为