Invisible components still take up space JPanel

前端 未结 6 1302
渐次进展
渐次进展 2021-01-18 05:22

I have a series of components underneath each other in a JPanel set as a GridLayout. I need to temporarily hide the components but setVisible(false) doesn\'t cu

6条回答
  •  囚心锁ツ
    2021-01-18 06:11

    don't call Thread.sleep(int); during EDT, because block EDT, use javax.swing.Timer

    for example

    import java.awt.Color;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import javax.swing.*;
    import javax.swing.border.*;
    
    public class SSCCE extends JFrame {
    
        private static final long serialVersionUID = 1L;
        private JPanel innerPane = new JPanel();
        private JScrollPane scr = new JScrollPane(innerPane);
        private Timer timer;
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    SSCCE sSCCE = new SSCCE();
                }
            });
        }
    
        private JPanel getPane() {
            JPanel ret = new JPanel();
            JLabel lbl = new JLabel("This is a pane.");
            ret.add(lbl);
            ret.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
            ret.setBackground(Color.gray);
            return ret;
        }
    
        public SSCCE() {
            innerPane.setLayout(new GridLayout(0, 1));
            add(scr);
            for (int i = 0; i < 30; i++) {
                innerPane.add(getPane());
            }
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            pack();
            setVisible(true);
            start();
        }
    
        private void start() {
            timer = new javax.swing.Timer(2000, updateCol());
            timer.start();
            timer.setRepeats(false);
        }
    
        private Action updateCol() {
            return new AbstractAction("Hide Row Action") {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    for (int i = 0; i < 30; i++) {
                        if (i % 2 == 0) {
                            innerPane.getComponent(i).setVisible(false);
                        }
                    }
                }
            };
        }
    }
    

提交回复
热议问题