bellot@telecom-paristech.fr
Par le téléchargement ou la consultation de ce document, l'utilisateur accepte la licence d'utilisation qui y est attachée, telle que détaillée dans les dispositions suivantes, et s'engage à la respecter intégralement.
La licence des droits d'usage de ce document confère à l'utilisateur un droit d'usage sur le document consulté ou téléchargé, totalement ou en partie, dans les conditions définies ci-après, et à l'exclusion de toute utilisation commerciale.
Le droit d'usage défini par la licence autorise un usage dans un cadre académique, par un utilisateur donnant des cours dans un établissement d'enseignement secondaire ou supérieur et à l'exclusion expresse des formations commerciales et notamment de formation continue. Ce droit comprend :
Aucune modification du document dans son contenu, sa forme ou sa présentation n'est autorisée.
Les mentions relatives à la source du document et/ou à son auteur doivent être conservées dans leur intégralité.
Le droit d'usage défini par la licence est personnel, non exclusif et non transmissible.
Tout autre usage que ceux prévus par la licence est soumis à autorisation préalable et expresse de l'auteur : bellot@telecom-paristech.fr.
![]() |
Nous utilisons SWING ! |
![]() |
Tout au long, nous allons imposer une méthodologie qui n'est pas absolue. On peut pratiquer autrement. Cependant, elle apporte une pratique standardisée et facile à suivre. |
JFrame
.
JMenuBar
.
JPanel
.
![]() |
Google : JAVA SE7 JFrame |
![]() |
On recommande de créer une classe pour la fenêtre de votre application et une classe pour chaque composant majeur de l'interface. |
![]() |
Chaque composant qui contient d'autres composants gardera des
références sur ces derniers. Cela peut être utile
pour agir sur eux.
Par exemple, désactiver un bouton ou un menu. |
package ui ; import javax.swing.* ; public class DrawingApp extends JFrame { public DrawingApp() { super("Drawing Application") ; // Window title // Window menu bar creation ... // Window content creation ... setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ; // Explicit ! pack() ; // Components sizes and positions setVisible(true) ; // The great show } }
Quit
devra envoyer un message
à la fenêtre pour qu'elle se ferme.
![]() |
Nous décidons donc que
tous les composants devront connaître la fenêtre.
|
package ui ;
import javax.swing.* ;
public class QuitMenuItem extends JMenuItem
{
private final DrawingApp drawingApp ;
public QuitMenuItem(DrawingApp drawingApp)
{
super("Quit") ; // Text of menu item
this.drawingApp = drawingApp ;
}
}
![]() |
Il est possible de mettre des images dans les items de menu.
Il est possible d'associer des séquences clavier au menu. |
![]() |
Google : SWING Menu tutorial |
package ui ; import javax.swing.* ; public class FileMenu extends JMenu { ... private final QuitMenuItem quitMenuItem ; public FileMenu(DrawingApp drawingApp) { super("File") ; // Text of the menu // Create and add menu items ... add(quitMenuItem = new QuitMenuItem(drawingApp)) ; } }
package ui;
import javax.swing.* ;
public class DrawingMenuBar extends JMenuBar
{
private final FileMenu fileMenu ;
public DrawingMenuBar(DrawingApp drawingApp)
{
super() ;
// Create and add menus
add(fileMenu = new FileMenu(drawingApp)) ;
}
}
package ui;
import javax.swing.* ;
public class DrawingApp extends JFrame
{
private final DrawingMenuBar drawingMenuBar ;
public DrawingApp()
{
super("Drawing Application") ;
setJMenuBar(drawingMenuBar = new DrawingMenuBar(this)) ;
// Window content creation
...
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
pack() ;
setVisible(true) ;
}
}
package main; import ui.* ; public class Main { public static void main(String[] args) { new DrawingApp() ; } }
pack()
réduit sa taille au minimum.
![]() |
Nous avons créé une classe par objet et chacun de ces objets possède une référence sur la fenêtre. Cela facilitera la programmation de l'interface. |
JPanel
.
JPanel
peut contenir d'autres composants tels
que des boutons, des champs d'entrée, etc. Il peut aussi
contenir d'autres JPanel
.
Le contenu de la fenêtre est donc une hiérarchie de
JPanel
appelée arbre d'instanciation.
JPanel
peut également être utilisé pour dessiner.
JPanel
, positions et
tailles, est déterminée par un objet spécialisé
de la classe Layout
associé au JPanel
.
Les sous-composants apparaissent à l'intérieur du JPanel
.
Layout
.
Layout
permettant des
agencements différents.
![]() |
|
JPanel
vide, voir plus loin.
JPanel
dans
lequel on dessinera un témoin de la couleur courante.
package ui; import javax.swing.* ; public class ColorIndicator extends JPanel { private final DrawingApp drawingApp ; public ColorIndicator(DrawingApp drawingApp) { this.drawingApp = drawingApp ; setPreferredSize(new Dimension(100,100)) ; } }
package ui;
import javax.swing.* ;
public class ColorChooserButton extends JButton
{
private final DrawingApp drawingApp ;
public ColorChooserButton(DrawingApp drawingApp)
{
super("Choose color") ; // Button's text
this.drawingApp = drawingApp ;
}
}
![]() |
Google : Java button tutorial |
package ui;
import javax.swing.* ;
public class EraseSegmentButton extends JButton
{
private final DrawingApp drawingApp ;
public EraseSegmentButton(DrawingApp drawingApp)
{
super("Erase segment") ; // Button's text
this.drawingApp = drawingApp ;
}
}
![]() |
Google : JAVA SE7 GridLayout |
package ui;
import java.awt.*;
import javax.swing.* ;
public class ButtonsPanel extends JPanel
{
private final ColorIndicator colorIndicator ;
private final ColorChooserButton colorChooser ;
private final EraseSegmentButton eraseSegment ;
public ButtonsPanel(DrawingApp drawingApp)
{
setLayout(new GridLayout(1,3)) ; // 1 row, 3 columns
add(colorIndicator = new ColorIndicator (drawingApp)) ;
add(colorChooser = new ColorChooserButton (drawingApp)) ;
add(eraseSegment = new EraseSegmentButton (drawingApp)) ;
}
}
N.B. Il n'est pas nécessaire de faire attention aux maniaques qui aiment les alignements verticaux.
JPanel
dans
lequel on dessinera les segments.
package ui;
import javax.swing.* ;
import java.awt.* ;
public class DrawingPanel extends JPanel
{
private final DrawingApp drawingApp ;
public DrawingPanel(DrawingApp drawingApp)
{
this.drawingApp = drawingApp ;
setBackground(Color.WHITE) ;
// for pack() instruction
setPreferredSize(new Dimension(300,300)) ;
}
}
GridLayout
car les deux composants
auraient la même hauteur.
![]() |
Google : JAVA SE7 BorderLayout |
BorderLayout
: les composants peuvent être ajoutés dans les 5 parties.
package ui; import javax.swing.* ; import java.awt.*; public class WindowPanel extends JPanel { private final DrawingPanel drawingPanel ; private final ButtonsPanel buttonsPanel ; public WindowPanel(DrawingApp drawingApp) { setLayout(new BorderLayout()) ; add(drawingPanel = new DrawingPanel (drawingApp), BorderLayout.CENTER) ; add(buttonsPanel = new ButtonsPanel (drawingApp), BorderLayout.SOUTH) ; } }
package ui; import javax.swing.* ; public class DrawingApp extends JFrame { private final DrawingMenuBar drawingMenuBar ; private final WindowPanel windowPanel ; public DrawingApp() { super("Drawing Application") ; setJMenuBar(drawingMenuBar = new DrawingMenuBar(this)) ; setContentPane(windowPanel = new WindowPanel(this)) ; setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ; pack() ; setVisible(true) ; } }
BorderLayout
: North, South, East, West, Center.
GridLayout
: grille.
CardLayout
: onglets.
BoxLayout
: ligne ou colonne (très utile).
SpringLayout
: agencement avec des contraintes.
FlowLayout
: alignés de gauche à droite avec passage à la ligne.
GridBagLayout
: grille avec des contraintes (très flexible, compliqué).
LayoutManager
.
![]() |
Des questions ? |
![]() |