繁体   English   中英

在JFrame / JDesktopPane中可以看到JInternalFrame时,如何禁用/启用JFrame组件?

[英]How to Disable/Enable JFrame Component when JInternalFrame isVisible inside JFrame/JDesktopPane?

JInternalFrameJFrame / JDesktopPane可见时,如何禁用/启用JFrame组件? 例如,使每个JInternalFrame1JDesktopPane (在JFrame上设置的桌面窗格)上所有框架组件(如JMenuBar / JButton / etc)都可见。 设置为禁用。

有解决办法吗?

如果您引用了所有组件,则最好的办法是编写一个简单的方法来禁用所有功能(或多或少像状态机一样)。

如果您没有对所有这些的引用(例如使用反射的GUI),则需要获得一个根面板并对其进行迭代以找到每个组件并将其禁用。

看一下用于测试Netbeans的Jemmy工具,它们具有一个GUIBrowser,可以为您提供一个想法。

它利用了JXLayerJHLabs过滤器 ,基本上,它创建了一个自定义框架,将JRootPane包裹在JXLayer ,这使您可以“禁用”整个框架。

上离

import com.jhlabs.image.BlurFilter;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JRootPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import org.jdesktop.jxlayer.JXLayer;
import org.jdesktop.jxlayer.plaf.effect.BufferedImageOpEffect;
import org.jdesktop.jxlayer.plaf.ext.LockableUI;

public class EnabledFrame {

    public static void main(String[] args) {
        new EnabledFrame();
    }

    public EnabledFrame() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                final LayeredFrame frame = new LayeredFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());
                JMenuBar mb = new JMenuBar();
                JMenu mFile = new JMenu("File");
                mFile.add("Exit");
                frame.setJMenuBar(mb);
                mb.add(mFile);

                JButton btn = new JButton("Click me");
                btn.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        frame.setEnabled(false);
                    }
                });

                frame.add(btn);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class LayeredFrame extends JFrame {

        private BlurableLockedUI lockUI;
        private JXLayer<JRootPane> rootLayer;

        public LayeredFrame(String title) throws HeadlessException {
            super(title);
        }

        @Override
        protected void setRootPane(JRootPane root) {
            if (rootLayer != null) {
                remove(rootLayer);
            }
            super.setRootPane(root);
            JRootPane rootPane = getRootPane();
            rootLayer = new JXLayer<>(root);
            rootLayer.setUI(getLockUI());
            add(rootLayer, BorderLayout.CENTER);
        }

        protected BlurableLockedUI getLockUI() {
            if (lockUI == null) {
                lockUI = new BlurableLockedUI();
            }
            return lockUI;
        }

        @Override
        public void setEnabled(boolean b) {
            getLockUI().setLocked(!b);
            super.setEnabled(b);
        }

    }

    public class BlurableLockedUI extends LockableUI {

        public BlurableLockedUI() {
            super(new BufferedImageOpEffect(new BlurFilter()));
        }

        public void repaint() {
            setDirty(true);
        }

        public void invalidate() {
            setDirty(true);
        }

        public void revalidate() {
            setDirty(true);
        }

    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM