在 JPanel 中使用 GlassPane [英] Using a GlassPane in a JPanel

查看:34
本文介绍了在 JPanel 中使用 GlassPane的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用 glassPane 函数在加载数据期间停用面板中的组件.我知道玻璃板仅适用于框架.在我的应用程序中,我无法访问框架.我只想停用框架中的单个面板.

i want to use a glassPane function to deactivate Components in a Panel during the loading of data. I know the the glasspane is only available in frames. In my application i have no access to the frame. I just want to deactivate a single panel in the frame.

我试图通过覆盖面板的paint或paintComponent方法在面板上绘制一个ractangle.问题是底层组件仍然可用.

I tried to draw a ractangle over the panel by overriding the paint or paintComponent method of the panel. The problem is that the underlaying components are still available.

谁能给我一个建议,我该如何解决这个问题?

could anyone give me an advice how i can solve this problem?

问候

dbausnnd

推荐答案

一种可能性——使用 JLayeredPane 包裹你的 JPanel,然后激活它上面的 JPanel 层,让它窃取焦点和 MouseListener.例如:

One possibility -- use a JLayeredPane to wrap around your JPanel, and then activate a JPanel layer that is held above it, having it steal the focus and the MouseListener. For example:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;

import javax.swing.*;

public class MyGlassPaneWrapper extends JLayeredPane {
   private JPanel glassPanel = new JPanel();

   public MyGlassPaneWrapper(JComponent myPanel) {
      glassPanel.setOpaque(false);
      glassPanel.setVisible(false);
      glassPanel.addMouseListener(new MouseAdapter() {});
      glassPanel.setFocusable(true);

      myPanel.setSize(myPanel.getPreferredSize());
      add(myPanel, JLayeredPane.DEFAULT_LAYER);
      add(glassPanel, JLayeredPane.PALETTE_LAYER);

      glassPanel.setPreferredSize(myPanel.getPreferredSize());
      glassPanel.setSize(myPanel.getPreferredSize());
      setPreferredSize(myPanel.getPreferredSize());
   }

   public void activateGlassPane(boolean activate) {
      glassPanel.setVisible(activate);
      if (activate) {
         glassPanel.requestFocusInWindow();
         glassPanel.setFocusTraversalKeysEnabled(false);
      } 
   }

   private static void createAndShowGui() {
      final MyPanel myPanel = new MyPanel();
      final MyGlassPaneWrapper myGlassPaneWrapper = new MyGlassPaneWrapper(myPanel);
      final String activateGlassPane = "Activate GlassPane";
      final String deactivateGlassPane = "Deactivate GlassPane";

      JToggleButton toggleButton = new JToggleButton(activateGlassPane);
      toggleButton.addItemListener(new ItemListener() {

         @Override
         public void itemStateChanged(ItemEvent e) {
            AbstractButton source = (AbstractButton) e.getSource();
            if (e.getStateChange() == ItemEvent.SELECTED) {
               source.setText(deactivateGlassPane);
               myGlassPaneWrapper.activateGlassPane(true);
            } else {
               source.setText(activateGlassPane);
               myGlassPaneWrapper.activateGlassPane(false);
            }
         }
      });
      JPanel buttonPanel = new JPanel();
      buttonPanel.add(toggleButton);

      JFrame frame = new JFrame("MyGlassPane");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(myGlassPaneWrapper);
      frame.getContentPane().add(buttonPanel, BorderLayout.PAGE_END);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class MyPanel extends JPanel {

   public MyPanel() {
      add(new JTextField(5));
      add(new JComboBox<String>(new String[]{"Monday", "Tuesday", "Wednesday"}));
      add(new JButton(new AbstractAction("Push Me") {

         @Override
         public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(MyPanel.this, "Button Pushed");
         }
      }));
   }
}

这篇关于在 JPanel 中使用 GlassPane的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆