Avec la classe JInternalFrame, vous pouvez insérer dans un JDesktopPane, des fenêtres internes, et les déplacer, les réduire, les fermer, etc.
L'image suivante présente deux JInternalFrames ouvertes dans un JDesktopPane.
Les JInternalFrame ne peuvent s'ouvrir que dans un JDesktopPane. Pour les utiliser, il faut donc placer un JDesktopPane dans une container Swing (par exemple une JFrame).
/* Création de la fenêtre contenant les fenêtres internes */ JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(600, 600); f.setLocationRelativeTo(null); /* Création du JDesktopPane et ajout dans la fenêtre de l'application */ JDesktopPane desktop = new JDesktopPane(); f.add(desktop, BorderLayout.CENTER);
Les fenêtres internes sont des instances de la classe JInternalFrame, la documentation se trouve ici : http://docs.oracle.com/javase/7/docs/api/javax/swing/JInternalFrame.html
/* Création de la fenêtre interne */ JInternalFrame jif = new JInternalFrame("Fenetre"); jif.setSize(200, 200); /* Ajout au desktop */ desktop.add(jif); jif.setVisible(true);
Par défaut la fenêtre interne n'est ni redimentionnable, ni déplacable, etc. Pour offir ces fonctionnalités, on utilise les méthodes suivantes :
/* Permet à l'utilisateur de fermer la fenêtre */ jif.setClosable(true); /* Permet à l'utilisateur de redimmentionner la fenêtre */ jif.setResizable(true); /* Permet à l'utilisateur d'agrandir la fenêtre */ jif.setMaximizable(true); /* Permet à l'utilisateur de réduire la fenêtre*/ jif.setIconifiable(true);
Pour faire remonter une fenêtre intenre au premier plan sans que l'utilisateur ne la séléctionne au préalable, on utilise la méthode toFront()
jif.toFront();
Pour que les fenêtres apparaissenet légèrement décalées les unes par rapport aux autres, on utilise un entier qui nous donne un décalage à chaque apparation d'une nouvelle fenêtre.
/* Permet de décaler les fenêtres verticalement */ private static int frameCountY=1; /* Permet de décaler les fenêtres horizonalement */ private static int frameCountX=0;
A chaque fois qu'une fenêtre interne est ajoutée, on incrémente frameCountY jusqu'à 8. Une fois à 8, frameCountY reprend une valeur de 1 et frameCountX est incrémenté.
if(frameCountY++>8){ frameCountY=1; if(frameCountX++>4){ frameCountY=1; frameCountX=1; } }
Pour décaler les fenêtres, il suffit alors d'utiliser la méthode setLocation() de cette manière :
jif.setLocation(new Point(15*frameCountY+100*frameCountX, 15*frameCountY));
import java.awt.BorderLayout; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.UIManager; public class ExempleJInternalFrame { private static int frameCountY=1; private static int frameCountX=0; public static void main(String[] args){ try{ UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch(Exception e){} JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(600, 600); f.setLocationRelativeTo(null); final JDesktopPane desktop = new JDesktopPane(); f.add(desktop, BorderLayout.CENTER); JMenuBar menu = new JMenuBar(); JMenu fichier = new JMenu("Fichier"); JMenuItem nouveau = new JMenuItem("Nouveau"); fichier.add(nouveau); f.add(menu, BorderLayout.NORTH); menu.add(fichier); nouveau.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JInternalFrame jif = new JInternalFrame(); jif.setTitle("Titre"); jif.setClosable(true); jif.setResizable(true); jif.setMaximizable(true); jif.setIconifiable(true); jif.toFront(); jif.setSize(200, 200); desktop.add(jif); jif.setVisible(true); jif.setLocation(new Point(15*frameCountY+100*frameCountX, 15*frameCountY)); if(frameCountY++>8){ frameCountY=1; if(frameCountX++>4){ frameCountY=1; frameCountX=1; } } } }); f.setVisible(true); } }