Swing - Moodle INSA Rouen

publicité
Introduction Contenant Composants Mise en page Exemple
Introduction Contenant Composants Mise en page Exemple
1
Introduction
Présentation
Organisation
Programmation
- Swing -
2
Contenant
JFrame
JMenu
Nicolas Malandain
3
Composants
4
Mise en page
Fonctionnement
AvecLayoutManager
Sans LayoutManager
5
Exemple
May 4, 2010
as
as
Architecture des Systèmes d’Information
Swing
Introduction Contenant Composants Mise en page Exemple
Architecture des Systèmes d’Information
1 / 27
Présentation Organisation
Swing
Introduction Contenant Composants Mise en page Exemple
Swing
2 / 27
Présentation Organisation
Deux niveaux d’interface 1 / 3
Présentation
Outil de fenêtrage fournit par Java à partir des versions 1.1. en
packages séparés de la JVM.
Composants
Ceux sont les briques élémentaires d’une interface, c’est principalement
avec eux que l’utilisateur “dialogue”.
depuis la version 1.2 dans les JFC puis dans Java
principal avantage : portable quelque soit le window manager ou
l’OS
Exemples de composants
Bouton (JButton)
Différences entre SWING et AWT :
Swing utilise l’AWT (tous les objets héritent de Container),
Étiquette (JLabel)
Gestion du Look&Feel dans Swing,
Liste (JList)
Pas de code natif dans les composants Swing,
Champs de saisie (JTextField)
Possibilités de mettre des images dans des boutons, des
étiquettes,. . .
...
Il ne faut pas mélanger les éléments AWT et SWING.
Swing
3 / 27
Swing
4 / 27
Introduction Contenant Composants Mise en page Exemple
Présentation Organisation
Introduction Contenant Composants Mise en page Exemple
Deux niveaux d’interface 2 / 3
Deux niveaux d’interface 3 / 3
Contenants
Ils servent à organiser les composants. Un composant ne peut être utilisé
que dans un contenant.
Exemples de contenants (containers)
JWindow (fenêtre sans titre ni encadrement)
JFrame (fenêtre classique)
JDialog (boite de dialogue possibilité de la rendre modale)
JApplet (panneau intégré dans un navigateur)
les contenants intermédiaires sont aussi des composants.
Packages nécessaires
contenants intermédiaires (intermediate containers)
javax.swing
java.awt
java.awt.event
JPanel (simple panneau)
JScrollPane (panneau avec barres de défilement)
JTabbedPane (panneau avec onglets)
...
Swing
5 / 27
JFrame JMenu
Swing
Introduction Contenant Composants Mise en page Exemple
Présentation : JFrame 1 / 2
6 / 27
JFrame JMenu
Présentation : JFrame 2 / 2
Constructeurs et méthodes utiles
JFrame() construit une fenêtre invisible sans titre,
Description de la JFrame
Frame
JFrame(String) construit une fenêtre invisible avec titre,
Menu Bar
Élément principaux : ContentPane, JMenuBar
Glass Pane
Container getContentPane()
void setContentPane( Container )
JMenuBar getJMenuBar()
pack() demande a la fenêtre et a ses composants de s’ajuster,
setVisible(boolean) affiche ou cache la fenêtre
...
Ajout de composants dans la JFrame
On n’ajoute pas à la JFrame mais au ContentPane
void setJMenuBar( JMenuBar )
Root Pane
Organisation
La disposition des composants est gérée par des LayoutManager
Remarques :
toute interface graphique a obligatoirement un contenant de
haut-niveau,
contenants de haut-niveau (top-level containers)
Introduction Contenant Composants Mise en page Exemple
Présentation Organisation
Content Pane
Layered Pane
Toute interface graphique a obligatoirement un contenant de haut-niveau
soit on utilise le ContentPane donné,
Ctrl-Shift-F1 : affichage hiérarchie et propriétés des objets graphiques
Swing
Le ContentPane fourni est un Container géré par un BorderLayout
soit un nouveau ContentPane est créé.
7 / 27
Swing
8 / 27
Introduction Contenant Composants Mise en page Exemple
JFrame JMenu
Introduction Contenant Composants Mise en page Exemple
JFrame JMenu
Exemple : JFrame
Quelques méthodes de plus
setTitle(String), getTitle()
setDefaultCloseOperation(int)
Exemple10
import java.awt.*;
import javax.swing.*;
public class Exemple10 {
DO NOTHING ON CLOSE
HIDE ON CLOSE (par défaut)
DISPOSE ON CLOSE
EXIT ON CLOSE
public static void main(String args[]) {
// 1er cas, on utilise le ContentPane
JFrame frame1 = new JFrame("Ceci est une fen^
etre");
Container contentpane1 = frame1.getContentPane();
contentpane1.add(new JButton("Ceci est un bouton dans cette fen^
etre"), BorderLayout.CENTER);
frame1.pack();
frame1.setVisible(true);
}
}
// 2eme cas, on crée un autre ContentPane
JFrame frame2 = new JFrame("Ceci est toujours une fen^
etre");
setResizable(boolean), isResizable()
JPanel contentpane2 = new JPanel();
contentpane2.setBorder(BorderFactory.createTitledBorder("Ceci est un bord"));
contentpane2.add(new JButton("Ceci est un bouton dans cette fen^
etre"));
frame2.setContentPane(contentpane2);
setIconImage(Image), Image getIconImage()
frame2.pack();
frame2.setVisible(true);
Remarque
Un contenant intermédiaire n’a pas de ContentPane, on l’utilise
directement.
Swing
Introduction Contenant Composants Mise en page Exemple
9 / 27
JFrame JMenu
Swing
Introduction Contenant Composants Mise en page Exemple
Hiérarchie des classes
10 / 27
JFrame JMenu
Construction/Manipulation 1 / 2
Construction d’une barre de menu
JMenuBar()
Construction de la barre de menu et ajout à la fenêtre
JMenuBar menuBar = new JMenuBar();
JFrame frame = new JFrame("essai de menu");
frame.setJMenuBar(menuBar);
Construction d’un menu
JMenu(), JMenu(String nom), JMenu(String nom, boolean
volant)
Remarque
Un menu JMenu est aussi un JMenuItem
Construction d’un menu et ajout à la barre
JMenu menu = new JMenu("Mon menu");
menuBar.add(menu);
Swing
11 / 27
Swing
12 / 27
Introduction Contenant Composants Mise en page Exemple
JFrame JMenu
Introduction Contenant Composants Mise en page Exemple
Construction/Manipulation 2 / 2
JFrame JMenu
Exemple de menu 1 / 3
Construction d’un élément de menu
JMenuItem(), JMenuItem(Icon icon), JMenuItem(String text),
JMenuItem(String text, int mnemonic)
Construction d’un élément et ajout au menu
JMenuItem menuItem = new JMenuItem("Element",KeyEvent.VK_E);
menu.add(menuItem);
Exemple20.java (. . . )
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
Manipulation
il existe aussi des méthodes pour retirer des éléments des menus,
public class Exemple20 {
public static void main(String[] args) {
MaFenetre mf = new MaFenetre("Fen^
etre + Menu");
mf.pack();
mf.setVisible(true);
}
il est possible d’activer ou de désactiver des menus ou des éléments,
...
}
Swing
Introduction Contenant Composants Mise en page Exemple
Swing
13 / 27
JFrame JMenu
Introduction Contenant Composants Mise en page Exemple
Exemple de menu 2 / 3
14 / 27
JFrame JMenu
Exemple de menu 3 / 3
Exemple20.java
Exemple20.java (. . . )
// 3eme et 4eme elements, Groupe de boutons radio
ButtonGroup group = new ButtonGroup();
rbMenuItem1 = new JRadioButtonMenuItem("Bouton radio 1");
rbMenuItem1.setSelected(true);
group.add(rbMenuItem1);
menu.add(rbMenuItem1);
rbMenuItem2 = new JRadioButtonMenuItem("Bouton radio 2");
rbMenuItem2.setSelected(true);
group.add(rbMenuItem2);
menu.add(rbMenuItem2);
class MaFenetre extends JFrame {
public MaFenetre(String titre) {
super(titre);
((JComponent)getContentPane()).setPreferredSize(new Dimension(300,200));
JMenuBar menuBar;
JMenu menu, sousMenu;
JMenuItem menuItem;
JCheckBoxMenuItem cbMenuItem;
JRadioButtonMenuItem rbMenuItem1, rbMenuItem2;
// creation de la barre de menu
menuBar = new JMenuBar();
setJMenuBar(menuBar);
// creation du 1er menu et de ses elements
menu = new JMenu("Menu 1");
menu.setMnemonic(KeyEvent.VK_1);
menuBar.add(menu);
// 1er element
menuItem = new JMenuItem("Simple Item",KeyEvent.VK_S);
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK));
menu.add(menuItem);
// un separateur
menu.addSeparator();
// 5eme element, une case a cocher
cbMenuItem = new JCheckBoxMenuItem("Case a cocher");
cbMenuItem.setMnemonic(KeyEvent.VK_C);
menu.add(cbMenuItem);
// 6eme element, un sous menu
sousMenu = new JMenu("Sous menu");
menu.add(sousMenu);
// elements du sous menu
menuItem = new JMenuItem("Element de sous menu");
sousMenu.add(menuItem);
// 2eme element
menuItem = new JMenuItem("Item avc image",new ImageIcon("radio.gif"));
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, ActionEvent.ALT_MASK));
menu.add(menuItem);
// creation du 2eme menu
menu = new JMenu("Menu 2");
menu.setMnemonic(KeyEvent.VK_2);
menuBar.add(menu);
// un separateur
menu.addSeparator();
}
Swing
15 / 27
}
Swing
16 / 27
Introduction Contenant Composants Mise en page Exemple
Introduction Contenant Composants Mise en page Exemple
Comportements de base
Quelques composants
JComponent
JLabel
Classe de base des composants Swing
JLabel e = new JLabel("étiquette",SwingConstants.LEFT);
Quelques méthodes
apparence
set/getBorder, set/getForeground, set/getBackground,
set/getFont, setOpaque, isOpaque
JButton
JButton b = new JButton("Le bouton");
JTextField
JTextField t = new JTextField("texte",10);
état
setToolTipText, setEnabled, isEnabled, set/getCursor,
setVisible, isVisible
JCheckBox
JCheckbox c = new JCheckbox("checkbox",true);
affichage
repaint, revalidate, paintComponent
mise en page
set/getPreferredSize, set/getMinimumSize,
set/getMaximumSize, set/getAlignmentX,
set/getAlignmentY
Swing
Introduction Contenant Composants Mise en page Exemple
JRadioButton
JRadioButton rb1 = new JRadioButton("radio 1");
JRadioButton rb2 = new JRadioButton("radio 2");
ButtonGroup bg = new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
17 / 27
Fonctionnement AvecLayoutManager Sans LayoutManager
LayoutManager
Swing
Introduction Contenant Composants Mise en page Exemple
18 / 27
Fonctionnement AvecLayoutManager Sans LayoutManager
Fonctionnement de l’ajustement 1 / 2
Objectif du LayoutManager
Demande d’information descendante
Pour ajuster la taille d’une JFrame à son contenu il va interroger chacun
des objets contenus qui vont eux-mêmes interroger les objets qu’ils
contiennent... Les dimensions des objets et des marges seront
additionnées à la remontée des appels.
Demande à chaque composant ses préférences dimensionnelles et les
ajuste les uns par rapport aux autres.
Sans LayoutManager : positions et dimensions sont fixés
Construction d’interface graphique
5 informations pour s’ajuster
setPreferredSize(Dimension d)
Gestion Liste
Nicolas
Maurice
Jacques
Mauro
setMinimumSize(Dimension d)
panneau
Maurice
setMaximumSize(Dimemsion d)
Ajouter Enlever
setAlignmentX(float f), setAlignmentY(float f)
panneau
Swing
19 / 27
Swing
20 / 27
Introduction Contenant Composants Mise en page Exemple
Fonctionnement AvecLayoutManager Sans LayoutManager
Introduction Contenant Composants Mise en page Exemple
Fonctionnement AvecLayoutManager Sans LayoutManager
Quelques LayoutManager
Fonctionnement de l’ajustement 2 / 2
Remarques
La plupart des composants règlent eux-mêmes leur taille en fonction de
ce qu’ils contiennent. Par exemple, une JLabel en fonction du texte
qu’elle contient.
5 exemples LayoutManager
Ajout des composants
leContenant.add(...leComposant ...)
GridLayout positionne les composants dans des cellules définies par une
grille et utilise le maximum d’espace.
FlowLayout positionne les composants les uns derrière les autres.
BorderLayout positionne les composants dans 5 endroits (NORTH,
SOUTH, EAST, WEST, CENTER) en maximisant l’espace
occupé.
GridBagLayout idem, mais autorise les composants à utiliser plus d’une
cellule, de plus les cellules ne sont pas forcément de la
même taille.
L’envoi de message est sur le contenant, mais le choix du message
dépend du LayoutManager
BoxLayout positionne les composants avec la possibilité de les aligner.
Rappel
Pour les contenants de haut-niveau, les composants sont ajoutés au
ContentPane et non au contenant directement.
Swing
Introduction Contenant Composants Mise en page Exemple
Ajustement de l’interface par la méthode pack()
21 / 27
Fonctionnement AvecLayoutManager Sans LayoutManager
FlowLayout
Swing
Introduction Contenant Composants Mise en page Exemple
22 / 27
Fonctionnement AvecLayoutManager Sans LayoutManager
BorderLayout
Flow.java
import javax.swing.*;
import java.awt.*;
import java.io.*;
JTextField t = new JTextField("texte",10);
contentPane.add(t);
public class Flow {
public static void main(String[] params) {
JFrame frame = new JFrame("FlowLayout");
Container contentPane = frame.getContentPane();
contentPane.setLayout(new FlowLayout());
BorderL.java
JCheckBox c = new JCheckBox("checkbox",true);
contentPane.add(c);
import javax.swing.*;
import java.awt.*;
String[] dataCombo = {"titi","tata","toto"};
JComboBox ch = new JComboBox(dataCombo);
contentPane.add(ch);
public class BorderL {
public static void main(String[] params) {
JFrame frame = new JFrame("BorderLayout");
Container contentPane = frame.getContentPane();
frame.pack(); // lance l’ordre de réorganisation
frame.setVisible(true);
JLabel e = new JLabel("étiquette",SwingConstants.LEFT);
contentPane.add(e);
}
JCheckBox c = new JCheckBox("checkbox",true);
contentPane.add(BorderLayout.SOUTH,c);
JLabel e = new JLabel("étiquette",SwingConstants.LEFT);
contentPane.add(BorderLayout.WEST,e);
String[] dataList = {"item 1","item 2","item 3","item 4"};
JList l = new JList(dataList);
l.setVisibleRowCount(3);
JScrollPane scrollList = new JScrollPane(l);
contentPane.add(scrollList);
Swing
JTextField t = new JTextField("texte",10);
contentPane.add(BorderLayout.CENTER,t);
// un BorderLayout avec marges entre composants
contentPane.setLayout(new BorderLayout(10,10));
}
JButton b = new JButton("Le bouton");
contentPane.add(b);
String[] dataList = {"item 1","item 2","item 3","item 4"};
JList l = new JList(dataList);
l.setVisibleRowCount(3);
JScrollPane scrollList = new JScrollPane(l);
contentPane.add(BorderLayout.NORTH,scrollList);
JButton b = new JButton("Le bouton");
contentPane.add(BorderLayout.EAST,b);
23 / 27
frame.pack(); // lance l’ordre de réorganisation
frame.setVisible(true);
}
}
Swing
24 / 27
Introduction Contenant Composants Mise en page Exemple
Fonctionnement AvecLayoutManager Sans LayoutManager
BoxLayout
Introduction Contenant Composants Mise en page Exemple
Fonctionnement AvecLayoutManager Sans LayoutManager
Positionnement absolu
PosAbsolue.java
import javax.swing.*;
import java.awt.*;
public class PosAbsolue {
public static void main(String[] params) {
MaJFrame mf = new MaJFrame("Ma JFrame");
mf.setSize(200,350);
// ne pas faire de pack sinon la fenetre se reduit à la taille 0
//
mf.pack();
mf.setVisible(true);
}
}
BoxL.java
import javax.swing.*;
import java.awt.*;
import java.io.*;
// creation d’une boite vide extensible
Dimension minSize = new Dimension(200, 5);
Dimension prefSize = new Dimension(200, 50);
Dimension maxSize = new Dimension(200, 100);
contentPane.add(new Box.Filler(minSize, prefSize, maxSize));
public class BoxL {
public static void main(String[] params) {
// creation d’une boite vide remplissant l’espace au maximum
JFrame frame = new JFrame("BoxLayout");
//
contentPane.add(Box.createGlue());
JPanel contentPane = new JPanel();
frame.setContentPane(contentPane);
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
JButton b3 = new JButton("CC");
b3.setAlignmentX(JComponent.RIGHT_ALIGNEMENT);
JButton b1 = new JButton("AAAAAAAA");
contentPane.add(b3);
b1.setAlignmentX(JComponent.CENTER_ALIGNEMENT);
contentPane.add(b1);
JButton b4 = new JButton("D");
b4.setAlignmentX((float)0.2);
// creation d’une boite vide de 5 pixel de haut
contentPane.add(b4);
contentPane.add(Box.createRigidArea(new Dimension(0,5)));
JButton b2 = new JButton("BBBB");
b2.setAlignmentX(JComponent.LEFT_ALIGNEMENT);
contentPane.add(b2);
}
}
frame.pack(); // lance l’ordre de réorganisation
frame.setVisible(true);
Swing
25 / 27
Introduction Contenant Composants Mise en page Exemple
Exemple Gestion de Liste 1 / 1
Exemple30.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
JScrollPane listScrollPane = new JScrollPane(list);
add(listScrollPane, BorderLayout.CENTER);
// panneau contenant le textfield et les 2 boutons
JPanel panneauBouton = new JPanel();
public class Exemple30 {
public static void main(String[] args) {
JFrame fenetre= new JFrame("Gestion de liste");
PanneauGestionListe panneauGL = new PanneauGestionListe();
fenetre.setContentPane(panneauGL);
fenetre.pack();
fenetre.setVisible(true);
}
}
class PanneauGestionListe extends JPanel {
private JList list;
private DefaultListModel listModel;
private JTextField nomPersonne;
// création des boutons et du champs de saisie
JButton ajout = new JButton("Ajouter");
JButton enlever = new JButton("Enlever");
nomPersonne = new JTextField(10);
nomPersonne.setText(list.getSelectedValue().toString());
panneauBouton.add(nomPersonne);
panneauBouton.add(ajout);
panneauBouton.add(enlever);
add(panneauBouton, BorderLayout.SOUTH);
}
}
public PanneauGestionListe() {
setLayout(new BorderLayout());
// création de la liste
listModel = new DefaultListModel();
listModel.addElement("Nicolas");
listModel.addElement("Maurice");
listModel.addElement("Jacques");
listModel.addElement("Mauro");
list = new JList(listModel);
list.setSelectedIndex(0);
Swing
27 / 27
class MaJFrame extends JFrame {
private JLabel e;
private JButton b;
private JTextField t;
private JCheckBox c;
MaJFrame(String s) {
super(s);
Container contentpane = getContentPane();
contentpane.setLayout(null);
Insets i = getInsets();
Rectangle r = new Rectangle(i.left+10, i.top+10, 100, 40);
e = new JLabel("étiquette",SwingConstants.LEFT);
e.setBounds(r);
contentpane.add(e);
r.x+=20;
r.y+=50;
t = new JTextField("texte",10);
t.setBounds(r);
contentpane.add(t);
}
r.x+=20;
r.y+=50;
c = new JCheckBox("checkbox",true);
c.setBounds(r);
contentpane.add(c);
}
r.x+=20;
r.y+=50;
b = new JButton("Le bouton");
b.setBounds(r);
contentpane.add(b);
Swing
26 / 27
Téléchargement