Java Swing: Enabling/Disabling all components in JPanel

前端 未结 4 1308
醉梦人生
醉梦人生 2020-12-09 21:40

I have a JPanel which contains a JToolbar (including few buttons without text) and a JTable and I need to enable/disable (make internal widgets not clickable). I tried this:

相关标签:
4条回答
  • 2020-12-09 22:19

    It requires a recursive call.

    Disable All In Container

    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();
                }
            });
        }}
    
    0 讨论(0)
  • 2020-12-09 22:19

    I used the following function:

    void setPanelEnabled(JPanel panel, Boolean isEnabled) {
        panel.setEnabled(isEnabled);
    
        Component[] components = panel.getComponents();
    
        for(int i = 0; i < components.length; i++) {
            if(components[i].getClass().getName() == "javax.swing.JPanel") {
                setPanelEnabled((JPanel) components[i], isEnabled);
            }
    
            components[i].setEnabled(isEnabled);
        }
    }
    
    0 讨论(0)
  • 2020-12-09 22:26

    @Kesavamoorthi if you want to make it more general:

    void setPanelEnabled(java.awt.Container cont, Boolean isEnabled) {
        cont.setEnabled(isEnabled);
    
        java.awt.Component[] components = cont.getComponents();
    
        for (int i = 0; i < components.length; i++) {
            if (components[i] instanceof java.awt.Container) {
                setPanelEnabled((java.awt.Container) components[i], isEnabled);
            }
            components[i].setEnabled(isEnabled);
        }
    }
    
    0 讨论(0)
  • 2020-12-09 22:32

    you can overlay whole Container / JComponent

    1. GlassPane block by default MouseEvents, but not Keyboard, required consume all keyevents from ToolKit

    2. JLayer (Java7) based on JXLayer (Java6)

    3. can't see reason(s) why not works for you

    enter image description here

    enter image description here

    enter image description here

    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.LineBorder;
    
    public class AddComponentsAtRuntime {
    
        private JFrame f;
        private JPanel panel;
        private JCheckBox checkValidate, checkReValidate, checkRepaint, checkPack;
    
        public AddComponentsAtRuntime() {
            JButton b = new JButton();
            //b.setBackground(Color.red);
            b.setBorder(new LineBorder(Color.black, 2));
            b.setPreferredSize(new Dimension(600, 20));
            panel = new JPanel(new GridLayout(0, 1));
            panel.add(b);
            f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(panel, "Center");
            f.add(getCheckBoxPanel(), "South");
            f.setLocation(200, 200);
            f.pack();
            f.setVisible(true);
        }
    
        private JPanel getCheckBoxPanel() {
            checkValidate = new JCheckBox("validate");
            checkValidate.setSelected(false);
            checkReValidate = new JCheckBox("revalidate");
            checkReValidate.setSelected(true);
            checkRepaint = new JCheckBox("repaint");
            checkRepaint.setSelected(true);
            checkPack = new JCheckBox("pack");
            checkPack.setSelected(true);
            JButton addComp = new JButton("Add New One");
            addComp.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    JButton b = new JButton();
                    //b.setBackground(Color.red);
                    b.setBorder(new LineBorder(Color.black, 2));
                    b.setPreferredSize(new Dimension(400, 10));
                    panel.add(b);
                    makeChange();
                    System.out.println(" Components Count after Adds :" + panel.getComponentCount());
                }
            });
            JButton removeComp = new JButton("Remove One");
            removeComp.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    int count = panel.getComponentCount();
                    if (count > 0) {
                        panel.remove(0);
                    }
                    makeChange();
                    System.out.println(" Components Count after Removes :" + panel.getComponentCount());
                }
            });
            JButton disabledComp = new JButton("Disabled All");
            disabledComp.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    for (Component c : panel.getComponents()) {
                        c.setEnabled(false);
                    }
                }
            });
            JButton enabledComp = new JButton("Enabled All");
            enabledComp.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    for (Component c : panel.getComponents()) {
                        c.setEnabled(true);
                    }
                }
            });
            JPanel panel2 = new JPanel();
            panel2.add(checkValidate);
            panel2.add(checkReValidate);
            panel2.add(checkRepaint);
            panel2.add(checkPack);
            panel2.add(addComp);
            panel2.add(removeComp);
            panel2.add(disabledComp);
            panel2.add(enabledComp);
            return panel2;
        }
    
        private void makeChange() {
            if (checkValidate.isSelected()) {
                panel.validate();
            }
            if (checkReValidate.isSelected()) {
                panel.revalidate();
            }
            if (checkRepaint.isSelected()) {
                panel.repaint();
            }
            if (checkPack.isSelected()) {
                f.pack();
            }
        }
    
        public static void main(String[] args) {
            AddComponentsAtRuntime makingChanges = new AddComponentsAtRuntime();
        }
    }
    
    0 讨论(0)
提交回复
热议问题