Reputation: 314
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
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