java – 在根容器中分层多个GlassPane
发布时间:2020-12-15 02:30:25 所属栏目:Java 来源:网络整理
导读:是否可以为单个JFrame添加多个GlassPanes,或者我是否必须使用不舒服的LayeredPane和Opacity属性. 我附上了一些显示我想要做的代码(由@camickr提供). import java.awt.*;import java.awt.event.*;import java.util.*;import javax.swing.*;import javax.swing
是否可以为单个JFrame添加多个GlassPanes,或者我是否必须使用不舒服的LayeredPane和Opacity属性.
我附上了一些显示我想要做的代码(由@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); 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以获取有关Root窗格的说明以及Glass窗格实际上是什么.
玻璃窗格只是添加具有根窗格大小的组件的一种便捷方式,它可以阻止所有输入事件.这允许您捕获与组件的任何交互以创建“请稍候…”屏幕. 每个根容器只有一个玻璃窗格.你不能分层玻璃窗格. 如果要在当前玻璃窗格上叠层,可以用其他东西替换玻璃窗格的内容.您还可以将JPanel设置为玻璃窗格,它允许您在玻璃窗格中布局多个组件. 通常,您应该只使用玻璃窗格来阻止用户输入(如果需要,还会显示某种“请稍候”消息).您能否提供一个用例,说明为什么要将玻璃窗格放在一起? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |