Ritesh
Ritesh

Reputation: 314

Loading a separate JPanel/JInternalFrame into a separate JDesktopPane(in a JFrame)

Suppose I have a class NewMDIApplication extends javax.swing.JFrame which contains a JDesktopPane and a JButton. Also suppose I have another class NewJInternalFrame extends javax.swing.JInternalFrame or NewJPanel extends javax.swing.JPanel which again contains some 'buttons' and 'text boxes' for performing some actions.

My intention is to load NewJInternalFrame's object or NewJPanel's object into JDesktopPane of NewMDIApplication when I click the JButton. Is it possible to be done? If yes, how to do this?

Upvotes: 1

Views: 2644

Answers (1)

Andrew Thompson
Andrew Thompson

Reputation: 168815

Here is a working example of adding JInternalFrame instances to a JDesktopPane. Note that you need to set a size or they do not appear.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class FrameWithInternalFrames {

    public static void main(String[] args) {
        Runnable r = new Runnable() {

        @Override
        public void run() {
            // the GUI as seen by the user (without frame)
            JPanel gui = new JPanel(new BorderLayout());
            gui.setBorder(new EmptyBorder(2, 3, 2, 3));

            gui.setPreferredSize(new Dimension(400, 100));
            gui.setBackground(Color.WHITE);

            final JDesktopPane dtp = new JDesktopPane();
            gui.add(dtp, BorderLayout.CENTER);

            JButton newFrame = new JButton("Add Frame");

            ActionListener listener = new ActionListener() {
            private int disp = 10;
            @Override
            public void actionPerformed(ActionEvent e) {
                JInternalFrame jif = new JInternalFrame();
                dtp.add(jif);
                jif.setLocation(disp, disp);
                jif.setSize(100,100); // VERY important!
                disp += 10;
                jif.setVisible(true);
            }
            };
            newFrame.addActionListener(listener);

            gui.add(newFrame, BorderLayout.PAGE_START);

            JFrame f = new JFrame("Demo");
            f.add(gui);
            // Ensures JVM closes after frame(s) closed and
            // all non-daemon threads are finished
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            // See http://stackoverflow.com/a/7143398/418556 for demo.
            f.setLocationByPlatform(true);

            // ensures the frame is the minimum size it needs to be
            // in order display the components within it
            f.pack();
            // should be done last, to avoid flickering, moving,
            // resizing artifacts.
            f.setVisible(true);
        }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(r);
    }
}

Upvotes: 1

Related Questions