Utilisation des JInternalFrame

Utiliser les JInternalFrame

Présentation

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.

Construction du bureau (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);

Ajout d'une fenêtre interne

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);

Définir les boutons de la JInternalFrame

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);

Faire apparaitre une fenêtre au premier plan

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();

Placement des fenêtres

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));

Code complet de l'exemple

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);
 }

}
A voir également
Ce document intitulé « Utilisation des JInternalFrame » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous