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

本秂侑毒 提交于 2019-12-11 11:50:56

问题


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?


回答1:


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.




回答2:


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

    }

}


来源:https://stackoverflow.com/questions/20799814/how-to-disable-enable-jframe-component-when-jinternalframe-isvisible-inside-jfra

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!