首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JPanel中使用GlassPane

在JPanel中使用GlassPane
EN

Stack Overflow用户
提问于 2015-03-19 21:10:19
回答 3查看 7.3K关注 0票数 2

我想在加载数据的过程中使用glassPane函数来停用面板中的元件。我知道glasspane只在框架中可用。在我的应用程序中,我没有访问框架的权限。我只想停用框架中的一个面板。

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

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

问候

dbausnnd

EN

回答 3

Stack Overflow用户

发布于 2015-03-19 22:45:46

一种可能是--使用JLayeredPane包裹JPanel,然后激活位于其上的JPanel层,使其窃取焦点和MouseListener。例如:

代码语言:javascript
复制
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");
         }
      }));
   }
}
票数 4
EN

Stack Overflow用户

发布于 2015-03-19 22:46:02

在我的应用程序中,我没有访问框架的权限。我只想停用框架中的一个面板。

您可以始终使用:

代码语言:javascript
复制
Window frame = SwingUtilities.windowForComponent(...);

我只想停用框架中的一个面板。

或者您可以尝试使用Disabled Panel。它允许您简单地禁用特定面板上的组件。

第二种绘制禁用外观的方法可能会有问题,因为在创建GUI时需要使用禁用面板。

票数 4
EN

Stack Overflow用户

发布于 2019-01-09 07:40:38

通过将glasspane包装在JRootPane的内容窗格中,可以将glasspane添加到JPanel。然后,您可以使用半透明的glasspane捕获鼠标和键盘事件,以便在数据加载期间将其停用,请参见https://tips4java.wordpress.com/2008/11/07/disabled-glass-pane/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29145472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档