Search code examples
javaswingjinternalframejdesktop

how can do not to duplicate internal frame


I am testing some code that is using internal frame. So I don't wanna open the new internal frame that is already running in my program. I mean when I click a menu to open some internal frame that is already open in my outerframe, that internal frame may duplicate in my frame and how can I solve that case. Please.


Solution

  • here is a very simple example, hope it will help you.

    I extended a JInternalFrame

    import javax.swing.JInternalFrame;
    
    public class WeatherIFrame extends JInternalFrame {
    
        public WeatherIFrame() {
            this.setTitle("Weather");
            this.setSize(300, 200);
            this.setVisible(true);
            this.setClosable(true);
            this.setResizable(true);        
        }
    }
    

    A Class, which generates the JFrame and contains the JDesktopPane

    import de.professional_webworkx.dashboard.internalframes.WeatherIFrame;
    import java.awt.Menu;
    import java.awt.MenuBar;
    import java.awt.MenuItem;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JDesktopPane;
    import javax.swing.JFrame;
    import javax.swing.event.InternalFrameAdapter;
    import javax.swing.event.InternalFrameEvent;
    import javax.swing.event.InternalFrameListener;
    
    public class MainFrame extends JFrame {
    
        private JDesktopPane desktopPane;
        private WeatherIFrame weatherIFrame;
    
        /**
         * Menuitems
         */
        MenuItem openWeatherFrame;
        MenuItem exitApp;
    
        public MainFrame() {            
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setTitle("Dashboad");
            this.setSize(1024, 768);
            this.getContentPane().add(initDesktopPane());
            this.setMenuBar(initMenu());
            this.setVisible(true);
        }
    
        private JDesktopPane initDesktopPane() {
            desktopPane = new JDesktopPane();
            return desktopPane;
        }
    
        private MenuBar initMenu() {
            MenuBar menuBar = new MenuBar();
            Menu fileMenu = new Menu("File");
            openWeatherFrame = new MenuItem("Show Weatherforcast");
            openWeatherFrame.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    if(weatherIFrame == null) {
                        weatherIFrame = new WeatherIFrame();
                        weatherIFrame.addInternalFrameListener(new InternalFrameListener() {
    
                            @Override
                            public void internalFrameOpened(InternalFrameEvent e) {
                            }
    
                            @Override
                            public void internalFrameClosing(InternalFrameEvent e) {
                            }
    
                            @Override
                            public void internalFrameClosed(InternalFrameEvent e) {
                                weatherIFrame = null;
                            }
    
                            @Override
                            public void internalFrameIconified(InternalFrameEvent e) {
                            }
    
                            @Override
                            public void internalFrameDeiconified(InternalFrameEvent e) {
                            }
    
                            @Override
                            public void internalFrameActivated(InternalFrameEvent e) {
                            }
    
                            @Override
                            public void internalFrameDeactivated(InternalFrameEvent e) {
                            }
                        });
                        desktopPane.add(weatherIFrame);
                    }
    
                }
            });            
            fileMenu.add(openWeatherFrame);
            menuBar.add(fileMenu);
            return menuBar;
        }
    }
    

    And now, run it.

    import de.professional_webworkx.dashboard.frame.MainFrame;
    import javax.swing.SwingUtilities;
    
    public class Dashboard {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new MainFrame();
                }
            });
        }    
    }