简体   繁体   中英

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

How to Disable/Enable JFrame components when JInternalFrame isVisible inside JFrame / JDesktopPane ? For example, make every JInternalFrame1 visible on the JDesktopPane (desktop pane set on the JFrame ) all frame components like JMenuBar / JButton /etc. set disabled.

Have a solution?

If you have a reference to all your components, the best shot is to write a simple method that would disable everything (more or less like a state machine).

If you don't have a reference to all of them (like a GUI that uses reflection) you will need to get a root panel and iterate over it finding every component and disabling it.

Take a look at the Jemmy tool that is used to test Netbeans, they have a GUIBrowser that can give you an idea.

That makes use of JXLayer and JHLabs filters , basically, it creates a custom frame that wraps the JRootPane in a JXLayer , which allows you to "disable" the entire frame...

上离

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);
        }

    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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