Search code examples
javaswingresizejframecomponentlistener

Java 7 resize a JFrame (my GUI): the componentListener is not getting fired


I've Googled around and could not find an answer:

I have a JFrame as a GUI and set a componentListener like

this.addComponentListener(new CL(this, logger));

In the componentListener I have the componentResized, etc...

public void componentResized(ComponentEvent e) {
    if (e.getSource() == gui) {
       here I do the code
    }
}

Everything is working fine under Java 6, but under Java 7, the Jframe is being resized but is not being repainted: the component listener is not getting called

I tried some alternatives from StackOverflow in the way of coding, but no way to make it work.

When I minimize the GUI window and restore it, then "componentResized" is being called.

Anyone an idea what's going on and why it works under Java 6 and not Java 7.

Here is a sample code:

public class Frame extends JFrame {
    private JPanel  panel;
    public Frame() {
        super();
        getContentPane().setBounds(new Rectangle(0, 0, 200, 200));
        getContentPane().setLayout(null);
        getContentPane().add(getPanel());
        this.addComponentListener(new ComponentListener() {
            @Override
            public void componentResized(ComponentEvent e) {
                System.out.println("Window Resized: Frame");}
            @Override
            public void componentMoved(ComponentEvent e) {}
            @Override
            public void componentShown(ComponentEvent e) {}
            @Override
            public void componentHidden(ComponentEvent e) {}});
        this.setSize(200, 200);
        this.setPreferredSize(new Dimension(200, 200));
        this.pack();
    }
    public JPanel getPanel() {
        if (panel == null) {
            panel = new JPanel();
            panel.setBackground(Color.RED);
            panel.setBounds(0, 0, 200, 200);
            panel.setPreferredSize(new Dimension(200, 200));
        }
        return panel;
    }
}

And this is the startup class:

public class StartUp {
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        Frame app = new Frame();
        app.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        app.pack();
        app.setVisible(true);
    }
}

When run under Java 6 you get the "Window Resized: Frame" message.
The same run under Java 7, no messages at all.

Below are 2 links to Pictures:

  • Java 6

Java 6 Frame Image

  • Java 7

Java 7 Frame Image


Solution

    • your code (before balast removed, changed to standard) work for me correctly

    • ComponentListener firing an event from every pixels

    • this is basic property of componentResized(), otherwise required SwingTimer.restart() untill resize ended)

    balast removed, changed to standard

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.event.ComponentAdapter;
    import java.awt.event.ComponentEvent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    
    public class MyFrame {
    
        private JFrame frame = new JFrame();
        private JPanel panel;
    
        public MyFrame() {
            frame.add(getPanel());
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
            frame.addComponentListener(new ComponentAdapter() {
                @Override
                public void componentResized(ComponentEvent e) {
                    System.out.println("Window Resized: Frame");
                }
            });
        }
    
        public JPanel getPanel() {
            if (panel == null) {
                panel = new JPanel() {
                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(300, 200);
                    }
                };
                panel.setBackground(Color.RED);
            }
            return panel;
        }
    
        public static void main(String[] args) {
            try {
                UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
            } catch (Exception e) {
                e.printStackTrace();
            }
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    MyFrame app = new MyFrame();
                }
            });
        }
    }