Swing - e

publicité
SWING
Concepts
Swing : librairie Java

Fournie avec le JDK (Java Development Kit)

Quelques classes intégrées dans le JDK1.1.5+

Complètement intégrée à partir de la version 1.2

Avant le JDK1.1.5 : librairie AWT

Swing utilise des éléments d'AWT

Plus une avancée qu'une remise en cause d'AWT
Java Foundation Classes

JFC est constituée de 5 API :

AWT

Java 2D

Accessibility

Drag and Drop

Swing
Différences AWT - Swing


AWT

Composants natifs qui utilisent les widgets du système
d'exploitation

L'apparence des composants varie selon l'OS
Swing

Composants dessinés par Java

Indépendance vis-à-vis de l'OS

L'apparence des composants ne varie pas
Parenté AWT -Swing
Package Swing (1)

javax.swing

javax.swing.border

javax.swing.colorchooser

javax.swing.event

javax.swing.filechooser

javax.swing.plaf.*
Package Swing (2)

javax.swing.table

javax.swing.text

javax.swing.text.html.*

javax.swing.text.rtf

javax.swing.tree

javax.swing.undo

javax.accessibility
Composants d'une IHM

Fenêtre


Composé graphique


Contient un objet ou plusieurs objets composés
Contient des objets graphiques de type composant et
composé
Composant graphique

Objet graphique de base
Patron de conception
Composite
Fenêtres

JWindow


JFrame


Hérite de la classe AWT : Window
Hérite de la classe AWT : Frame
JDialog

Hérite de la classe AWT : Dialog

Comportement « modal »
JFrame (1)

JFrame

La fenêtre la plus utilisée

Comportements :
Méthode : setDefaultCloseOperation()





DO_NOTHING_ON_CLOSE (hérité de AWT)
HIDE_ON_CLOSE
DISPOSE_ON_CLOSE
EXIT_ON_CLOSE
JFrame (2)
JFRAME
LayeredPane
rootPane
ContentPane
GlassPane
JFrame (3)

MenuBar


jframe.setJMenuBar(JMenuBar menu)
ContentPane

Accesseur



Container jframe.getContentPane()
Container et pas un J Component comme le J Panel
Ajout de composants

jframe.getContentPane().add(Component ...)
Exemple
import java.awt.*;
import javax.swing.*;
public class Premiere {
public static void main(String s[] ) {
JFrame fenetre = new JFrame("maFenetre");
JLabel texte = new JLabel ("Bonjour le Monde");
fenetre.getContentPane().add(texte);
fenetre.setVisible(true); // show()
}
}
JPanel

Une classe incontournable

Hérite de JComponent

Peu d'impact graphique

Noeud idéal dans une arborescence de composants

Ajout de composant

JPanel panneau = new JPanel();

JLabel texte = new JLabel(''le texte'');


panneau.add(texte);
Par défaut son Layout Manager est un FlowLayout
Exemple
import java.awt.*;
import javax.swing.*;
public class Deuxieme {
public static void main(String s[] ) {
JFrame fenetre = new JFrame("maFenetre");
JPanel panneau = new JPanel();
JLabel label = new JLabel() ;
label.setText("Nom");
label.setIcon(new ImageIcon("icon2.gif");
JTextField champ = new JTextField();
panneau.add(label);
panneau.add(champ);
fenetre.getContentPane().add(panneau); //fenetre.setContentPane(panneau);
fenetre.setVisible(true);
}
Autres panneaux

JScrollPane

JTabbedPane



Panneau à onglets
JSplitPane


Panneau avec défilement
Panneau séparé en deux parties
JDesktopPane

Panneau de type bureau
Exemple
import java.awt.*;
import javax.swing.*;
public class Troisieme {
public static void main(String s[] ) {
String texte = new String("AAAAAABBBB ...");
JFrame fenetre = new JFrame("maFenetre");
JScrollPane panneau = new JScrollPane();
JLabel label = new JLabel(texte) ;
panneau.setViewportView(label);
fenetre.getContentPane().add(panneau);
fenetre.setVisible(true);
Les menus

La classe JFrame possède la faculté de gérer une
barre de menus

Classe JMenuBar

Composition :




JMenuBar
JMenu
JMenuItem
separator
Les composants d'un menu
JMenu
JMenuBar
JMenuItem
separator
Exemple (1)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Quatrieme {
public static void main(String s[] ) {
JFrame frame = new Jframe("mafenetre");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
JMenuBar cyanMenuBar = new JMenuBar();
cyanMenuBar.setOpaque(true);
cyanMenuBar.setBackground(Color.cyan);
cyanMenuBar.setPreferredSize(new Dimension(200,
20));
frame.setJMenuBar(cyanMenuBar);
frame.getContentPane().add(yellowLabel,
BorderLayout.CENTER);
frame.pack();
JLabel yellowLabel = new JLabel("");
frame.setVisible(true);
yellowLabel.setOpaque(true);
}
yellowLabel.setBackground(Color.yellow);
yellowLabel.setPreferredSize(new Dimension(200, 180));
}
Exemple (2)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
barreMenu.add(fichier);
barreMenu.add(edition);
barreMenu.setOpaque(true);
barreMenu.setBackground(Color.cyan);
barreMenu.setPreferredSize(new Dimension(200, 20));
public class Cinquieme {
public static void main(String s[] ) {
JFrame frame = new Jframe("mafenetre");
JMenuBar barreMenu = new JMenuBar();
JMenu fichier = new jMenu("Fichier");
JMenuItem nouveau = new JMenuItem("mafenetre");
fichier.add(nouveau);
fichier.addSeparator();
JMenu edition = new jMenu("Edition");
JMenuItem selection = new JMenuItem("Selection");
edition.add(selection);
frame.setJMenuBar(barreMenu);
frame.pack();
frame.setVisible(true);
}
}
Les Layouts (1)

Gérants de la disposition des composants d'un
panneau

Permettent de s'affranchir des coordonnées fixes pour
placer les composants

Implémentent une politique d'agrandissement des
fenêtres


Ils tendent à faire coincider taille effective des composants et
taille idéale : size et preferredSize
Appliquent différentes stratégies
Les Layouts (2)

FlowLayout


GridLayout


Divise l'espace en lignes et colonnes
BoxLayout



Aligne les composants de gauche à droite, centrés ou de
droite à gauche
Aligne les composants les uns à côté des autres
verticalement ou horizontalement
BorderLayout

Il contient 5 cases : centrale, nord, sud, est et ouest
Exemple
import java.awt.*;
import javax.swing.*;
public class Sixieme {
public static void main(String args[])
{
JFrame fenetre = new JFrame() ;
fenetre.getContentPane().setLayout( new BorderLayout() );
fenetre.getContentPane().add( new JButton("NORD") , BorderLayout.NORTH);
fenetre.getContentPane().add( new JButton("SUD") , BorderLayout.SOUTH);
fenetre.getContentPane().add( new JButton("EST") , BorderLayout.EAST);
fenetre.getContentPane().add( new JButton("OUEST") , BorderLayout.WEST);
fenetre.getContentPane().add( new JButton("CENTRE") , BorderLayout.CENTER);
fenetre.setResizable(false);
fenetre.setSize(200,200);
fenetre.setVisible(true);
}
}
Les composants (1)

Label

JLabel (javax.swing.Jlabel)

Méthodes




setText() (supporte le HTML)
setIcon()
setVerticalTextPosition()
setHorizontalTextPosition()
Les composants (2)

Champs

JTextField (javax.swing.JTextField)

Méthodes





setText()
setColumns()
copy()
cut()
paste()
Les composants (3)

Boutons

JButton (javax.swing.JButton)

Méthodes




setRolloverIcon()
setPressedIcon()
setMnemonic()
setBorderPainted()
Les composants (4)

Boutons avec état (on-off)

JToggleButton (javax.swing.JToggleButton)

Méthodes

setSelectedIcon()
Les composants (5)

Radio Boutons

JRadioButton (javax.swing.JRadioButton)

Méthodes


setSelected()
Cases à cocher

JCheckBox (javax.swing.JCheckBox)

Méthodes

setText()
Les composants (6)

Liste déroulante de choix

JComboBox (javax.swing.JComboBox)

Méthodes


setEditable()
Les bordures

(javax.swing.border.Border)


TitleBorder, EtchedBorder, BevelBorder
BorderFactory.createTitleBorder(String titre);
Les composants (7)

Méthodes communes

isEnabled()

setEnabled()

setVisible()

isVisible()
Exemple
import java.awt.*;
import javax.swing.*;
import java.util.*;
public class Septieme {
public static void main( String args[])
{
Vector items = new Vector();
items.add("Lundi");
items.add("Mardi");
items.add("Mercredi");
items.add("Jeudi");
items.add("Vendredi");
items.add("Samedi");
items.add("Dimanche");
JComboBox cb = new JComboBox(items);
JFrame fenetre = new JFrame() ;
fenetre.getContentPane().add(cb);
fenetre.setVisible(true);
}
}
Apparence


Look and Feel

Paramétrable (« pluggable »)

motif, windows, metal
Classe UIManager

setLookAndFeel()

UIManager.setLookAndFeel()
Exemple
import java.awt.*;
import javax.swing.*;
public class Huitieme {
public static void main( String args[])
{
String motif = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
UIManager.setLookAndFeel(motif);
JFrame fenetre = new JFrame() ;
JLabel libelle = new JLabel ("texte");
fenetre.getContentPane().add(libelle);
fenetre.setVisible(true);
}
}
Taille des composants (1)

Taille


Taille idéale


size ( setSize(), getSize() )
preferredSize ( setPreferredSize(), getPreferredSize() )
Taille minimale

minimumSize ( setMinimumSize(), getMinimumSize() )
Taille des composants (2)


Les Layout Manager respectent soit :

minimumSize

preferredSize
La méthode pack() appliquée sur la fenêtre


Calcul récursif des tailles sur l'arborescence des
composants et adaptation
Si taille toujours inadaptée

Réécrire les méthodes getPreferredSize() ou
getMinimumSize() des composants

Positionner une taille par setSize() (attention portabilité)
Position sur l'écran


Récupération de la taille de l'écran

Classe Toolkit

Méthode getScreenSize()
Positionnement

Objet fenêtre

méthode setLocation()
Exemple
import java.awt.*;
import javax.swing.*;
public class Neuvieme {
public static void main( String args[]) {
JFrame fenetre = new JFrame() ;
JLabel libelle = new JLabel ("Bonjour Le Monde");
fenetre.getContentPane().add(libelle);
//fenetre.pack();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if (frameSize.height > screenSize.height) { frameSize.height = screenSize.height; }
if (frameSize.width > screenSize.width) { frameSize.width = screenSize.width; }
frame.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
fenetre.setVisible(true);
}
}
Les événements (1)


Programmation événementielle

méthodes associées à des événements sur les composants

permet l'implémentation de la logique applicative
Evénements


souris, clavier, écran
Langages événementiels

Xwindow, Motif, VB, Java AWT-Swing, Smalltalk, etc

Basés sur le patron de conception Observateur
Patron de conception
Observateur
Les événements (2)

Classes d'événements
Intéraction utilisateur
Evénement émis
Passage du focus à un composant
FocusEvent
Clic sur un JPanel
MouseEvent
Frappe d'une touche clavier sur un JPanel
KeyEvent
Iconification d'une fenêtre
WindowEvent
Clic sur un bouton
ActionEvent
Ajout d'une lettre dans un JTextField
DocumentEvent
Sélection d'un item dans une JList
ListSelectionEvent
Les événements (3)

Observateurs swing

les listeners
1 -Attachement
Bouton
listener
2 -Clic
3 - Notification
Les événements (4)

Package java


java.awt.event.*
Attachement par la méthode :



addActionListener(ActionListener objet)
Interface ActionListener

Méthode : actionPerformed(ActionEvent e)

Il faut l'implémenter
Notification

Gérée par le langage
Exemple (1)
import java.awt.* ;
import javax.swing.* ;
import java.awt.event.* ;
public class Dixieme {
public static void main(String args[]) {
JFrame fenetre = new JFrame();
JButton bouton = new JButton("Cliquez");
bouton.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e)
{
JDialog dialogue = new JDialog();
JLabel message = new Jlabel("Merci");
dialogue.getContentPane().add(message);
dialogue.setModal(true);
dialogue.setVisible(true);
} });
fenetre.getContentPane().add(bouton);
fenetre.setVisible(true);
}
}
Exemple (2)
public class MonListener implements ActionListener
{
private String msg = "Merci";
private JFrame mere;
public MonListener(JFrame mere)
{
this.mere = mere;
}
public void actionPerformed(ActionEvent e)
{
JDialog dialogue = new JDialog();
JLabel message = new Jlabel(msg);
dialogue.getContentPane().add(message);
dialogue.setModal(true);
dialogue.setVisible(true);
dialogue.setLocationRelativeTo(mere);
}
}
Exemple (2) suite
public class Fenetre implements JFrame {
public Fenetre() {
JButton bouton = new JButton();
MonListener listener = new MonListener(this);
bouton.addActionListener(listener);
}
}
Téléchargement