jjzjj

Java Swing : Enabling/Disabling all components in JPanel

coder 2024-03-22 原文

我有一个 JPanel,其中包含一个 JToolbar(包括几个没有文本的按钮)和一个 JTable,我需要启用/禁用(使内部小部件不可点击)。我试过这个:

 JPanel panel = ....;
 for (Component c : panel.getComponents()) c.setEnabled(enabled);

但它不起作用。是否有更好、更通用的解决方案来启用/禁用 JPanel 中的所有内部组件?

从这里的示例开始,我已经使用 JLayer 部分解决了我的问题 http://docs.oracle.com/javase/tutorial/uiswing/misc/jlayer.html :

layer = new JLayer<JComponent>(myPanel, new BlurLayerUI(false));
.....
((BlurLayerUI)layer.getUI()).blur(...); // switch blur on/off


class BlurLayerUI extends LayerUI<JComponent> {
  private BufferedImage mOffscreenImage;
  private BufferedImageOp mOperation;

  private boolean blur;

  public BlurLayerUI(boolean blur) {
      this.blur = blur;
      float ninth = 1.0f / 9.0f;
        float[] blurKernel = {
          ninth, ninth, ninth,
          ninth, ninth, ninth,
          ninth, ninth, ninth
        };
        mOperation = new ConvolveOp(
                new Kernel(3, 3, blurKernel),
                ConvolveOp.EDGE_NO_OP, null);
        }

  public void blur(boolean blur) {
      this.blur=blur;
    firePropertyChange("blur", 0, 1);
   }

  @Override
  public void paint (Graphics g, JComponent c) {
      if (!blur) {
            super.paint (g, c);
            return;
        }

      int w = c.getWidth();
    int h = c.getHeight();



    if (w == 0 || h == 0) {
      return;
    }

    // Only create the offscreen image if the one we have
    // is the wrong size.
    if (mOffscreenImage == null ||
            mOffscreenImage.getWidth() != w ||
            mOffscreenImage.getHeight() != h) {
      mOffscreenImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    }

    Graphics2D ig2 = mOffscreenImage.createGraphics();
    ig2.setClip(g.getClip());
    super.paint(ig2, c);
    ig2.dispose();

    Graphics2D g2 = (Graphics2D)g;
    g2.drawImage(mOffscreenImage, mOperation, 0, 0);
  }

  @Override
  public void applyPropertyChange(PropertyChangeEvent pce, JLayer l) {
    if ("blur".equals(pce.getPropertyName())) {
      l.repaint();
    }
  }

}

我还有两个问题:

  1. 在上面的链接中,事件仅与鼠标相关。如何管理键盘事件?

  2. 如何创建“灰色”效果来代替模糊?

最佳答案

它需要递归调用。

import java.awt.*;
import javax.swing.*;

public class DisableAllInContainer {

    public void enableComponents(Container container, boolean enable) {
        Component[] components = container.getComponents();
        for (Component component : components) {
            component.setEnabled(enable);
            if (component instanceof Container) {
                enableComponents((Container)component, enable);
            }
        }
    }

    DisableAllInContainer() {
        JPanel gui = new JPanel(new BorderLayout());

        final JPanel container = new JPanel(new BorderLayout());
        gui.add(container, BorderLayout.CENTER);

        JToolBar tb = new JToolBar();
        container.add(tb, BorderLayout.NORTH);
        for (int ii=0; ii<3; ii++) {
            tb.add(new JButton("Button"));
        }

        JTree tree = new JTree();
        tree.setVisibleRowCount(6);
        container.add(new JScrollPane(tree), BorderLayout.WEST);

        container.add(new JTextArea(5,20), BorderLayout.CENTER);

        final JCheckBox enable = new JCheckBox("Enable", true);
        enable.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent ae) {
                enableComponents(container, enable.isSelected());
            }
        });
        gui.add(enable, BorderLayout.SOUTH);

        JOptionPane.showMessageDialog(null, gui);
    }

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

关于Java Swing : Enabling/Disabling all components in JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10985734/

有关Java Swing : Enabling/Disabling all components in JPanel的更多相关文章

  1. C++ 套接字 : Enabling Promiscuous Mode in Windows - 2

    我正在尝试修改我当前的套接字程序以捕获混杂的数据包。我目前所拥有的是能够正常抓包的。我已经看到关于如何在Linux上执行此操作的其他答案,但我需要找到一种在Windows上完成此操作的方法。这是我的代码:intmain(intargc,charconst*argv[]){SOCKETs;//Theboundsocketstructsockaddr_inserver;intrecv_len;//Sizeofreceiveddatacharudpbuf[BUFLEN];//Abufferfortheincomingdata.floatdata;//Thedatainthepacket//C

  2. windows - 德尔福 7 : Enabling automatic list of possible options for items I am working on? - 2

    我最近开始使用Delphi7,目前正在学习使用它制作应用程序。我在阅读基础知识时读过这篇文章:它说Delphi帮助我们列出了我们正在处理的项目的可能选项。这些可能的选项对我有很大帮助,因为我目前不知道有哪些选项,但是,当我编写时,我没有看到可能的选项窗口,如下所示:默认情况下它是否被禁用,如果是,我在哪里可以启用它?值得一提的是,我正在使用Windows10,Windows10确实警告我Delphi可能无法在我的Windows上正常工作,尽管我真诚地怀疑这就是这背后的原因,因为整个程序运行良好。在此先感谢您,对于这样的菜鸟问题,我深表歉意:) 最佳答案

  3. c++ - 关于 MSDN 代码示例, "Enabling and Disabling Privileges" - 2

    MSDN文章,EnablingandDisablingPrivilegesinC++,提供了一个代码示例来展示如何在访问token中启用或禁用权限。我引用被质疑的部分:tp.PrivilegeCount=1;tp.Privileges[0].Luid=luid;if(bEnablePrivilege)tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;elsetp.Privileges[0].Attributes=0;Attributes成员的零值是什么意思?根据TOKEN_PRIVILEGES的文档结构,权限的属性可以是以下值的组合:SE

  4. Java Swing : Enabling/Disabling all components in JPanel - 2

    我有一个JPanel,其中包含一个JToolbar(包括几个没有文本的按钮)和一个JTable,我需要启用/禁用(使内部小部件不可点击)。我试过这个:JPanelpanel=....;for(Componentc:panel.getComponents())c.setEnabled(enabled);但它不起作用。是否有更好、更通用的解决方案来启用/禁用JPanel中的所有内部组件?从这里的示例开始,我已经使用JLayer部分解决了我的问题http://docs.oracle.com/javase/tutorial/uiswing/misc/jlayer.html:layer=newJ

  5. 基于javaSwing、MySQL的酒店客房管理系统(附源码) - 2

    由于近期询要的人过多,自行加群769119544领取源码目录一、功能需求二、数据字典1.数据流条目2.文件条目三、用例图四、数据流图五、E-R图六、系统框架 七、数据库设计八、界面设计九、代码展示1、数据表对象层(domain层)1.1、房间对象初始化1.2、旅客对象初始化1.3、 管理员对象初始化2、数据访问对象层(dao层)2.1、房间相关信息2.2、旅客信息2.3、管理员信息3、util包3.1、JDBC交互数据库(DBUtil)3.2、实时时间(DateUtil)4、业务层(server层)4.1、房间(RoomContorller)4.2、旅客(RoomInContorller)4.

  6. 安卓 : Deny button pressed on Bluetooth enabling dialog box - 2

    如何处理蓝牙启用对话框中的“拒绝”按钮?我尝试使用OnDismissListener和OnCancelListener甚至尝试使用onActivityResult但没有用。代码是:privateBluetoothAdaptermBluetoothAdapter;privatestaticfinalintREQUEST_ENABLE_BT=1;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);if(isBleSupportedOnDevice()){ini

  7. android - java.lang.StackOverflowError : stack size 8MB while Enabling/Disabling TextView#setTextIsSelectable in ListView Adapter 错误 - 2

    我有一个ActivityListView。在每个列表项中显示TextView。使用这些方法切换所选位置的属性EditText#setTextIsSelectable、EditText#setEllipsize和EditText#setSingleLine。点击第一项效果很好。但是当我点击另一个项目时,我得到了StackOverFlowError。下面是我的代码示例。如果我做错了,请告诉我。importandroid.app.Activity;importandroid.content.Context;importandroid.os.Bundle;importandroid.text.

  8. android - Proguard 优化设置 : Enabling class merging, casts and field/* in modern API and Proguard versions - 2

    很长一段时间以来,我一直在混淆我的应用程序,我把以下设置当作咒语,因为它们是Google的推荐-optimizations!code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*但是,前几天我错误地评论了这一行,应用程序构建正确,并且“显然”有效。我做了很多测试,没能让它崩溃。所以我想知道是否需要那些禁用的优化设置......截至今天的AndroidSDK和最新的Proguard版本,我只针对Android4.0.3及更高版本(15)的设备,并使用Proguard5.1。对于那

  9. python - "Enabling"类比较 - 2

    这个问题在这里已经有了答案:ComparableclassesinPython3(5个答案)关闭3年前。我需要一些关于我的CSCHW的帮助。它在类/对象上,是一个定义圆的简单类,名称为classCircle(object)。HW的确切文本(我完成了这个hw的前两部分,因此这第三部分是对初始问题的扩展):"""通过使用、>=、以下代码:A=Circle(2,5,1.5)B=Circle(-6,1,1)printA=B应该生成这个输出:FalseTrueTrue这是我显示圆的坐标和半径的代码:classCircle(object):def__init__(self,x=0,y=0,r=0)

  10. python - "Enabling"类比较 - 2

    这个问题在这里已经有了答案:ComparableclassesinPython3(5个答案)关闭3年前。我需要一些关于我的CSCHW的帮助。它在类/对象上,是一个定义圆的简单类,名称为classCircle(object)。HW的确切文本(我完成了这个hw的前两部分,因此这第三部分是对初始问题的扩展):"""通过使用、>=、以下代码:A=Circle(2,5,1.5)B=Circle(-6,1,1)printA=B应该生成这个输出:FalseTrueTrue这是我显示圆的坐标和半径的代码:classCircle(object):def__init__(self,x=0,y=0,r=0)

随机推荐