Upload
luyu
View
50
Download
0
Embed Size (px)
DESCRIPTION
ESIL Laurent Henocque Cours mis à jour en Février 2008. Java Swing Eléments de Base. Licence Creative Commons. Cette création est mise à disposition selon le Contrat Paternité-Partage des Conditions Initiales à l'Identique 2.0 France disponible en ligne - PowerPoint PPT Presentation
Citation preview
Java SwingJava SwingEléments de BaseEléments de Base
ESILESIL
Laurent HenocqueLaurent Henocque
Cours mis à jour en Février Cours mis à jour en Février 20082008
Licence Creative CommonsLicence Creative Commons
Cette création est mise à disposition selon Cette création est mise à disposition selon le Contrat Paternité-Partage des le Contrat Paternité-Partage des Conditions Initiales à l'Identique 2.0 Conditions Initiales à l'Identique 2.0 France disponible en ligne France disponible en ligne
http://creativecommons.org/licenses/by-http://creativecommons.org/licenses/by-sa/2.0/fr/ sa/2.0/fr/
ou par courrier postal à Creative ou par courrier postal à Creative Commons, 559 Nathan Abbott Way, Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.Stanford, California 94305, USA.
IntroductionIntroduction
Swing est la bibliothèque Java performante Swing est la bibliothèque Java performante pour la réalisation des interfaces homme pour la réalisation des interfaces homme machine.machine.
Swing est actuellement en compétition Swing est actuellement en compétition avec SWT (Eclipse) et bientôt Flash et avec SWT (Eclipse) et bientôt Flash et Javascript (adobe flex et air)Javascript (adobe flex et air)
http://java.sun.com/docs/books/tutorial/http://java.sun.com/docs/books/tutorial/uiswing/index.htmluiswing/index.html
Présentation très rapidePrésentation très rapidedes conceptsdes concepts
Création d'une classe "frame"Création d'une classe "frame"
import javax.swing.JFrame;import javax.swing.JFrame;
public class MainFrame extends public class MainFrame extends JFrameJFrame{{ public MainFrame() public MainFrame() { { super("My title"); super("My title"); setSize(300, 300); setSize(300, 300); } }} }
Création d'une applicationCréation d'une applicationpublic class Application public class Application {{ public static void main(String[] args) public static void main(String[] args) { { // perform any initialization // perform any initialization MainFrame mf = new MainFrame(); MainFrame mf = new MainFrame(); mf.show(); mf.show(); } }} }
Fermer l'applicationFermer l'application
setDefaultCloseOperation(setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE);
Container content = getContentPane();Container content = getContentPane();content.add(new JButton("Button 1")); content.add(new JButton("Button 1"));
Ajout de composantsAjout de composants
Grouper des composantsGrouper des composants
JPanel panel=new JPanel();panel.add(new JButton("Button 1"));panel.add(new JButton("Button 2"));panel.add(new JButton("Button 3"));content.add(panel);
Gérer le Positionnement VariableGérer le Positionnement Variable
import java.awt.*;import javax.swing.*;
public class MainFrame extends JFrame{ public MainFrame() { super("My title"); setSize(300,300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container content = getContentPane(); content.setLayout(new BorderLayout()); JPanel panel = new JPanel(new FlowLayout()); panel.add(new JButton("Button 1")); panel.add(new JButton("Button 2")); panel.add(new JButton("Button 3")); content.add(panel, BorderLayout.SOUTH); content.add(new JTextArea(), BorderLayout.CENTER); }}
AscenseursAscenseurs
content.add(new JScrollPane(new JTextArea()), BorderLayout.CENTER);
Mixer les layoutsMixer les layouts
panel=new JPanel(new FlowLayout());panel.add(new JLabel("Enter your name"));panel.add(new JTextField(10));String options[] = new String[]{ "Option 1","Option 2","Option 2" };panel.add(new JComboBox(options));content.add(panel, BorderLayout.NORTH);
EvénementsEvénementsimport java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;
public class MainFrame extends JFrame { public MainFrame(){ super("My title");... JButton button1 = new JButton("Button 1"); panel.add(button1); button1.addActionListener( new MyButtonListener(this));... }
private class MyButtonListener implements ActionListener { private JFrame parentComponent; MyButtonListener(JFrame parentComponent){ this.parentComponent=parentComponent; }
public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(parentComponent, "BUTTON PRESSED!");} }}
Evénements (version 2)Evénements (version 2)
import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;
public class MainFrame extends JFrame { public MainFrame(){ super("My title");... JButton button1 = new JButton("Button 1"); panel.add(button1); button1.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(
e.getSource().parentComponent, "BUTTON PRESSED!");} });... }}
Présentation de la Présentation de la BibliothèqueBibliothèque
Squelette d’application SwingSquelette d’application Swing
import java.awt.*;import java.awt.*;import java.awt.event.*;import java.awt.event.*;import javax.swing.*;import javax.swing.*;public class JWinApp extends JFrame{public class JWinApp extends JFrame{
public JWinApp(String title, JPanel panel){public JWinApp(String title, JPanel panel){super(title); super(title); getContentPane().add(panel, BorderLayout.CENTER);getContentPane().add(panel, BorderLayout.CENTER);setSize(200,200); setSize(200,200); addWindowListener(new WindowAdapter(){addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we)public void windowClosing(WindowEvent we){ exitApp(); }{ exitApp(); } });});}}protected void exitApp(){protected void exitApp(){
setVisible(false);setVisible(false);dispose();dispose();System.exit(0);System.exit(0);
}}public static void main(String args[]) { new public static void main(String args[]) { new JWinApp(…).setVisible(true); }JWinApp(…).setVisible(true); }
}}
Hello WorldHello World
class WinHelloPanel extends JPanel implements class WinHelloPanel extends JPanel implements ActionListener{ActionListener{JLabel label = new JLabel("Hello World "); // un labelJLabel label = new JLabel("Hello World "); // un labelJButton button = new JButton("Click!"); // un boutonJButton button = new JButton("Click!"); // un boutonpublic WinHelloPanel(){public WinHelloPanel(){
add(label);add(label);add(button);add(button);button.addActionListener(this);button.addActionListener(this);
}}public void actionPerformed(ActionEvent ae){public void actionPerformed(ActionEvent ae){
JOptionPane.showMessageDialog(this, "Thanks for JOptionPane.showMessageDialog(this, "Thanks for Clicking.");Clicking.");}}
}}
Widgets commeWidgets comme AWT AWT
WidgetsWidgetsSwingSwing
JPanelJPanel
C’est un Panel léger offrant un C’est un Panel léger offrant un support pour le double buffering support pour le double buffering (technique d’affichage en deux (technique d’affichage en deux temps permettant d’éviter les temps permettant d’éviter les scintillements et défaut d’aspects)scintillements et défaut d’aspects)
Quand le buffering est activé Quand le buffering est activé (constructeur) tous les composants (constructeur) tous les composants se dessinent d’abord dans un buffer se dessinent d’abord dans un buffer non affichénon affiché
IconesIcones
Les icones sont utilisées avec tous les boutons ou Les icones sont utilisées avec tous les boutons ou autres composants.autres composants.
public interface Icon {public interface Icon { void paintIcon(Component c, Graphics g, int x, int y);void paintIcon(Component c, Graphics g, int x, int y); int getIconWidth();int getIconWidth(); int getIconHeight();int getIconHeight();}}
l’argument “c” sert à fournir une information l’argument “c” sert à fournir une information complémentaire au moment du dessin (police, couleur)complémentaire au moment du dessin (police, couleur)
x et y spécifient l’origine du dessinx et y spécifient l’origine du dessin
ImageIconImageIcon
Icon i = new ImageIcon(“Image.gif");Icon i = new ImageIcon(“Image.gif");
Icon j = new ImageIcon(Icon j = new ImageIcon(
new URL(“http://…Image.gif”));new URL(“http://…Image.gif”));
Avantages : Avantages : • url ou fichier, url ou fichier, • chargement asynchrone : pas de blocage de chargement asynchrone : pas de blocage de
l’interfacel’interface• l’image n’est pas sérializablel’image n’est pas sérializable
Créer sa propre iconeCréer sa propre icone
public class RedOval implements Icon {public class RedOval implements Icon { public void paintIcon (public void paintIcon (
Component c, Graphics g, int x, int y) {Component c, Graphics g, int x, int y) { g.setColor(Color.red);g.setColor(Color.red); g.drawOval (x, y, getIconWidth(), g.drawOval (x, y, getIconWidth(),
getIconHeight());getIconHeight()); }} public int getIconWidth() { return 10; }public int getIconWidth() { return 10; } public int getIconHeight() { return 10; }public int getIconHeight() { return 10; }}}
JLabelJLabelpublic class LabelPanel extends JPanel {public class LabelPanel extends JPanel { public LabelPanel() {public LabelPanel() { JLabel plainLabel = new JLabel("Petit Label");JLabel plainLabel = new JLabel("Petit Label"); add(plainLabel);add(plainLabel);
JLabel fancyLabel = new JLabel(« Super Beau Label"); JLabel fancyLabel = new JLabel(« Super Beau Label"); Font fancyFont = new Font("Serif", Font.BOLD | Font.ITALIC, Font fancyFont = new Font("Serif", Font.BOLD | Font.ITALIC,
32);32); fancyLabel.setFont(fancyFont);fancyLabel.setFont(fancyFont);
Icon tigerIcon = new ImageIcon("SmallTiger.gif"); Icon tigerIcon = new ImageIcon("SmallTiger.gif"); fancyLabel.setIcon(tigerIcon);fancyLabel.setIcon(tigerIcon); fancyLabel.setHorizontalAlignment(JLabel.RIGHT); fancyLabel.setHorizontalAlignment(JLabel.RIGHT); add(fancyLabel);add(fancyLabel); }}}}
JButtonJButton
public class ButtonPanel extends JPanel {public class ButtonPanel extends JPanel {
public ButtonPanel() {public ButtonPanel() {
Icon tigerIcon = new ImageIcon("SmallTiger.gif");Icon tigerIcon = new ImageIcon("SmallTiger.gif");
JButton myButton = new JButton("Tiger", tigerIcon);JButton myButton = new JButton("Tiger", tigerIcon);
add(myButton);add(myButton);
}}
}}
AbstractButtonAbstractButton Plusieurs classes Swing implémentent abstractButtonPlusieurs classes Swing implémentent abstractButton
setMnemonic() – accélérateur clavier : les constantes VK_* de KeyEvent setMnemonic() – accélérateur clavier : les constantes VK_* de KeyEvent
doClick() – appel du bouton par programme doClick() – appel du bouton par programme
setDisabledIcon(), setDisabledSelectedIcon(), setPressedIcon(), setDisabledIcon(), setDisabledSelectedIcon(), setPressedIcon(), setRolloverIcon(), setRolloverSelectedIcon(), setSelectedIcon() – setRolloverIcon(), setRolloverSelectedIcon(), setSelectedIcon() – modifications dynamique de l’icone modifications dynamique de l’icone
setVerticalAlignment(), setHorizontalAlignemnt()setVerticalAlignment(), setHorizontalAlignemnt()
setVerticalTextPosition(), setHorizontalTextPosition() – place le texte par setVerticalTextPosition(), setHorizontalTextPosition() – place le texte par rapport à l’icone rapport à l’icone
On peut spécifier le texte du label en html (<html> … <html>) à partir de On peut spécifier le texte du label en html (<html> … <html>) à partir de swing 1.1.1)swing 1.1.1)
JCheckBoxJCheckBox
classclass CheckboxPanel CheckboxPanel extendsextends JPanel { JPanel {
Icon no = Icon no = newnew ToggleIcon ( ToggleIcon (falsefalse);); Icon yes = Icon yes = newnew ToggleIcon ( ToggleIcon (truetrue););
publicpublic CheckboxPanel() { CheckboxPanel() {
setLayout(setLayout(newnew GridLayout(2, 1)); GridLayout(2, 1));
JCheckBox cb1 = JCheckBox cb1 = newnew JCheckBox("Choose Me", JCheckBox("Choose Me", truetrue););
cb1.setIcon(no);cb1.setIcon(no); cb1.setSelectedIcon(yes);cb1.setSelectedIcon(yes);
JCheckBox cb2 = JCheckBox cb2 = newnew JCheckBox("No Choose Me", JCheckBox("No Choose Me", falsefalse););
cb2.setIcon(no);cb2.setIcon(no); cb2.setSelectedIcon(yes);cb2.setSelectedIcon(yes);
add(cb1); add(cb2); add(cb1); add(cb2); }}
classclass ToggleIcon ToggleIcon implementsimplements Icon { Icon { booleanboolean state; state; publicpublic ToggleIcon ( ToggleIcon (booleanboolean s) { s) { state = s;state = s; }}
publicpublic voidvoid paintIcon (Component c, paintIcon (Component c, Graphics g, Graphics g, intint x, x, intint y) { y) {
intint width = getIconWidth(); width = getIconWidth(); intint height = getIconHeight(); height = getIconHeight(); g.setColor (Color.black);g.setColor (Color.black); ifif (state) g.fillRect (x, y, width, (state) g.fillRect (x, y, width,
height);height); elseelse g.drawRect (x, y, width, height); g.drawRect (x, y, width, height); }}
publicpublic intint getIconWidth() { getIconWidth() { returnreturn 10; 10; } }
publicpublic intint getIconHeight() { getIconHeight() { returnreturn 10; }10; }
}}}}
JRadioButtonJRadioButtonclass RadioButtonPanel extends JPanel {class RadioButtonPanel extends JPanel {public RadioButtonPanel() {public RadioButtonPanel() { setLayout(new GridLayout(4,1));setLayout(new GridLayout(4,1)); JRadioButton radioButton;JRadioButton radioButton; ButtonGroup rbg = new ButtonGroup();ButtonGroup rbg = new ButtonGroup(); JLabel label = new JLabel("Annual Salary: ");JLabel label = new JLabel("Annual Salary: "); label.setFont(new Font("SansSerif", Font.BOLD, label.setFont(new Font("SansSerif", Font.BOLD,
14));14)); add(label);add(label);
radioButton = new JRadioButton("$45,000");radioButton = new JRadioButton("$45,000"); radioButton.setMnemonic (KeyEvent.VK_4);radioButton.setMnemonic (KeyEvent.VK_4); add (radioButton); rbg.add (radioButton);add (radioButton); rbg.add (radioButton); radioButton.setSelected(true);radioButton.setSelected(true); radioButton = new JRadioButton("$60,000");radioButton = new JRadioButton("$60,000"); radioButton.setMnemonic (KeyEvent.VK_6);radioButton.setMnemonic (KeyEvent.VK_6); add (radioButton); rbg.add (radioButton);add (radioButton); rbg.add (radioButton); ......}}
JToggleButtonJToggleButton
class ToggleButtonPanel extends JPanel {class ToggleButtonPanel extends JPanel {
public ToggleButtonPanel() {public ToggleButtonPanel() {
// Set the layout to a GridLayout// Set the layout to a GridLayout
setLayout(new GridLayout(4,1, 10, 10));setLayout(new GridLayout(4,1, 10, 10));
add (new JToggleButton ("Fe"));add (new JToggleButton ("Fe")); add (new JToggleButton ("Fi"));add (new JToggleButton ("Fi")); add (new JToggleButton ("Fo"));add (new JToggleButton ("Fo")); add (new JToggleButton ("Fum"));add (new JToggleButton ("Fum")); }}}}
Méthodes de JTextComponentMéthodes de JTextComponent
copy()copy() cut()cut() paste()paste() getSelectedText()getSelectedText() setSelectionStart()setSelectionStart() setSelectionEnd()setSelectionEnd() selectAll()selectAll() replaceSelection() replaceSelection() getText()getText() setText()setText() setEditable()setEditable() setCaretPosition()setCaretPosition()
JTextFieldJTextField & & JTextAreaJTextArea
JTextField tf = new JTextField();JTextField tf = new JTextField();
JTextArea ta = new JTextArea();JTextArea ta = new JTextArea();
tf.setText("TextField");tf.setText("TextField");
ta.setText("JTextArea\n Multi Lignes");ta.setText("JTextArea\n Multi Lignes");
add(tf);add(tf);
add(new JScrollPane(ta)); // scroll au cas oùadd(new JScrollPane(ta)); // scroll au cas où
JTextPaneJTextPane
JTextPane est un éditeur de texte complet (avec JTextPane est un éditeur de texte complet (avec insertions d’images). Il s’appuie sur une liste de insertions d’images). Il s’appuie sur une liste de blocs dotés de stylesblocs dotés de styles
JTextPane tp = new JTextPane();JTextPane tp = new JTextPane();
MutableAttributeSet attr = new MutableAttributeSet attr = new SimpleAttributeSet();SimpleAttributeSet();
StyleConstants.setFontFamily(attr, "Serif");StyleConstants.setFontFamily(attr, "Serif"); StyleConstants.setFontSize(attr, 18);StyleConstants.setFontSize(attr, 18); StyleConstants.setBold(attr, true);StyleConstants.setBold(attr, true); tp.setCharacterAttributes(attr, false);tp.setCharacterAttributes(attr, false); add(new JScrollPane(tp));add(new JScrollPane(tp));
JTextPane exempleJTextPane exemple
class TextPanel extends JPanel {class TextPanel extends JPanel {
public TextPanel() {public TextPanel() { setLayout(new BorderLayout());setLayout(new BorderLayout());
JTextField textField = new JTextField();JTextField textField = new JTextField(); JTextArea textArea = new JTextArea();JTextArea textArea = new JTextArea(); JTextPane textPane = new JTextPane();JTextPane textPane = new JTextPane();
MutableAttributeSet attr = new SimpleAttributeSet();MutableAttributeSet attr = new SimpleAttributeSet(); StyleConstants.setFontFamily(attr, "Serif");StyleConstants.setFontFamily(attr, "Serif"); StyleConstants.setFontSize(attr, 18);StyleConstants.setFontSize(attr, 18); StyleConstants.setBold(attr, true);StyleConstants.setBold(attr, true); textPane.setCharacterAttributes(attr, false);textPane.setCharacterAttributes(attr, false);
add(textField, BorderLayout.NORTH);add(textField, BorderLayout.NORTH); add(new JScrollPane(textArea), BorderLayout.CENTER);add(new JScrollPane(textArea), BorderLayout.CENTER); add(new JScrollPane(textPane), BorderLayout.SOUTH);}}add(new JScrollPane(textPane), BorderLayout.SOUTH);}}
JPasswordFieldJPasswordField
class PasswordPanel extends JPanel {class PasswordPanel extends JPanel { PasswordPanel() {PasswordPanel() { JPasswordField p1 = new JPasswordField p1 = new
JPasswordField(20);JPasswordField(20); JPasswordField p2 = new JPasswordField p2 = new
JPasswordField(20);JPasswordField(20); p2.setEchoChar ('?');p2.setEchoChar ('?'); add(p1);add(p1); add(p2); add(p2); }}}}
JEditorPaneJEditorPane
JEditorPane est un éditeur de textes JEditorPane est un éditeur de textes permettant l’affichage de contenu permettant l’affichage de contenu
html, ou rtf, identifié par une URL, html, ou rtf, identifié par une URL, et permettant de suivre les lienset permettant de suivre les liens
SourceSourceclass Browser extends JPanel {class Browser extends JPanel { Browser() {Browser() { setLayout (new BorderLayout (5, 5));setLayout (new BorderLayout (5, 5)); final JEditorPane jt = new JEditorPane();final JEditorPane jt = new JEditorPane(); final JTextField input = new JTextField("http://java.sun.com");final JTextField input = new JTextField("http://java.sun.com"); jt.setEditable(false);jt.setEditable(false);
// suivre les liens :// suivre les liens : jt.addHyperlinkListener(new HyperlinkListener () {jt.addHyperlinkListener(new HyperlinkListener () { public void hyperlinkUpdate(final HyperlinkEvent e) {public void hyperlinkUpdate(final HyperlinkEvent e) { if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { SwingUtilities.invokeLater(new Runnable() {SwingUtilities.invokeLater(new Runnable() { public void run() { Document doc = jt.getDocument();public void run() { Document doc = jt.getDocument(); try { URL url = e.getURL(); jt.setPage(url); try { URL url = e.getURL(); jt.setPage(url);
input.setText (url.toString());input.setText (url.toString()); } catch (IOException io) {} catch (IOException io) { JOptionPane.showMessageDialog (JOptionPane.showMessageDialog ( Browser.this, "Can't follow link", "Invalid Input", Browser.this, "Can't follow link", "Invalid Input", JOptionPane.ERROR_MESSAGE);JOptionPane.ERROR_MESSAGE); jt.setDocument (doc);}}});jt.setDocument (doc);}}});}}});}}});
suitesuite
JScrollPane pane = new JScrollPane();JScrollPane pane = new JScrollPane(); pane.setBorder (pane.setBorder ( BorderFactory.createLoweredBevelBorder());BorderFactory.createLoweredBevelBorder()); pane.getViewport().add(jt);pane.getViewport().add(jt); add(pane, BorderLayout.CENTER);add(pane, BorderLayout.CENTER); input.addActionListener (new ActionListener() {input.addActionListener (new ActionListener() { public void actionPerformed (ActionEvent e) {public void actionPerformed (ActionEvent e) { try { jt.setPage (input.getText()); } try { jt.setPage (input.getText()); }
catch (IOException ex) {catch (IOException ex) { JOptionPane.showMessageDialog (JOptionPane.showMessageDialog ( Browser.this, "Invalid URL", "Invalid Input", Browser.this, "Invalid URL", "Invalid Input", JOptionPane.ERROR_MESSAGE); }JOptionPane.ERROR_MESSAGE); } } });} }); add (input, BorderLayout.SOUTH);}}add (input, BorderLayout.SOUTH);}}
JScrollBarJScrollBar
classclass ScrollbarPanel ScrollbarPanel extendsextends JPanel { JPanel { publicpublic ScrollbarPanel() { ScrollbarPanel() { setLayout(setLayout(newnew BorderLayout()); BorderLayout());
JScrollBar sb1 = JScrollBar sb1 = newnew JScrollBar (JScrollBar.VERTICAL, 0, 5, 0, 100); JScrollBar (JScrollBar.VERTICAL, 0, 5, 0, 100); add(sb1, BorderLayout.EAST);add(sb1, BorderLayout.EAST);
JScrollBar sb2 = JScrollBar sb2 = newnew JScrollBar (JScrollBar.HORIZONTAL, 0, 5, 0, 100); JScrollBar (JScrollBar.HORIZONTAL, 0, 5, 0, 100); add(sb2, BorderLayout.SOUTH);add(sb2, BorderLayout.SOUTH); }}}}
JSliderJSliderpublic class SliderPanel extends JPanel {public class SliderPanel extends JPanel { public SliderPanel() {public SliderPanel() { setLayout(new BorderLayout());setLayout(new BorderLayout());
JSlider s1 = new JSlider (JSlider.VERTICAL, 0, 100, 50);JSlider s1 = new JSlider (JSlider.VERTICAL, 0, 100, 50); s1.setPaintTicks(true);s1.setPaintTicks(true); s1.setMajorTickSpacing(10); s1.setMinorTickSpacing(2);s1.setMajorTickSpacing(10); s1.setMinorTickSpacing(2); add(s1, BorderLayout.EAST);add(s1, BorderLayout.EAST);
JSlider s2 = new JSlider (JSlider.VERTICAL, 0, 100, 50);JSlider s2 = new JSlider (JSlider.VERTICAL, 0, 100, 50); s2.setPaintTicks(true); s2.setMinorTickSpacing(5);s2.setPaintTicks(true); s2.setMinorTickSpacing(5); add(s2, BorderLayout.WEST);add(s2, BorderLayout.WEST); JSlider s3 = new JSlider (JSlider.HORIZONTAL, 0, 100, 50);JSlider s3 = new JSlider (JSlider.HORIZONTAL, 0, 100, 50); s3.setPaintTicks(true); s3.setMajorTickSpacing(10);s3.setPaintTicks(true); s3.setMajorTickSpacing(10); add(s3, BorderLayout.SOUTH);add(s3, BorderLayout.SOUTH);
JSlider s4 = JSlider s4 = new JSlider (JSlider.HORIZONTAL, 0, 100, 50);new JSlider (JSlider.HORIZONTAL, 0, 100, 50); s4.setBorder(BorderFactory.createLineBorder(Color.blue));s4.setBorder(BorderFactory.createLineBorder(Color.blue)); add(s4, BorderLayout.NORTH);add(s4, BorderLayout.NORTH); }}}}
JSlider et LabelsJSlider et Labelspublic class SliderPanel2 extends JPanel {public class SliderPanel2 extends JPanel { public SliderPanel2() {public SliderPanel2() { setLayout(new BorderLayout());setLayout(new BorderLayout()); JSlider right, bottom;JSlider right, bottom; right = new JSlider(JSlider.VERTICAL, 1, 9, 3);right = new JSlider(JSlider.VERTICAL, 1, 9, 3); Hashtable h = new Hashtable();Hashtable h = new Hashtable(); h.put (new Integer (1), new JLabel("Mercure"));h.put (new Integer (1), new JLabel("Mercure")); … …
right.setLabelTable (h);right.setLabelTable (h); right.setPaintLabels (true);right.setPaintLabels (true); right.setInverted (true);right.setInverted (true);
bottom = new JSlider(JSlider.HORIZONTAL, 0, 100, 25);bottom = new JSlider(JSlider.HORIZONTAL, 0, 100, 25); bottom.setMajorTickSpacing (10);bottom.setMajorTickSpacing (10); bottom.setPaintLabels (true);bottom.setPaintLabels (true); add(right, BorderLayout.EAST);add(right, BorderLayout.EAST); add(bottom, BorderLayout.SOUTH);add(bottom, BorderLayout.SOUTH); }}}}
JProgressBarJProgressBar
Créer une Progress Bar Créer une Progress Bar
• progressBar = new JProgressBar(0, progressBar = new JProgressBar(0, task.getLengthOfTask()); task.getLengthOfTask());
• progressBar.setValue(0); progressBar.setValue(0); • progressBar.setStringPainted(true); progressBar.setStringPainted(true);
Changer la valeur courante : Changer la valeur courante : • progressBar.setValue(task.getCurrent()); progressBar.setValue(task.getCurrent());
Utilisation du mode « indeterminate » Utilisation du mode « indeterminate » • progressBar = new JProgressBar(); progressBar = new JProgressBar(); • progressBar.setIndeterminate(true); progressBar.setIndeterminate(true); • ... // la taille devient connue... // la taille devient connue• progressBar.setMaximum(newLength); progressBar.setMaximum(newLength); • progressBar.setValue(newValue); progressBar.setValue(newValue); • progressBar.setIndeterminate(false); progressBar.setIndeterminate(false);
JComboBoxJComboBoxpublic class ComboPanel extends JPanel {public class ComboPanel extends JPanel { String choices[] = {"Mercure", "Venus", "Terre", "Mars", String choices[] = {"Mercure", "Venus", "Terre", "Mars", "Jupiter", "Saturne", "Uranus", "Neptune", "Pluton"};"Jupiter", "Saturne", "Uranus", "Neptune", "Pluton"}; public ComboPanel() {public ComboPanel() { JComboBox combo1 = new JComboBox(); JComboBox combo1 = new JComboBox(); JComboBox combo2 = new JComboBox();JComboBox combo2 = new JComboBox(); for (int i=0;i<choices.length;i++) {for (int i=0;i<choices.length;i++) { combo1.addItem (choices[i]); combo2.addItem (choices[i]);combo1.addItem (choices[i]); combo2.addItem (choices[i]); }} combo2.setEditable(true);combo2.setEditable(true); combo2.setSelectedItem("X");combo2.setSelectedItem("X"); combo2.setMaximumRowCount(4);combo2.setMaximumRowCount(4); add(combo1); add(combo2);add(combo1); add(combo2); }} public static void main (String args[]) {public static void main (String args[]) {… … } }} }
Callbacks ComboBoxCallbacks ComboBox
public class ComboBoxDemo implements ActionListener { public class ComboBoxDemo implements ActionListener { . . . . . . combo.addActionListener(this); combo.addActionListener(this); . . . . . . public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
JComboBox cb = (JComboBox)e.getSource(); JComboBox cb = (JComboBox)e.getSource(); String item = (String)cb.getSelectedItem(); String item = (String)cb.getSelectedItem(); . . . . . .
} } . . . . . . } }
JListJList
String label [] = {"a", "b", "c", "d", "e", String label [] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k" };"f", "g", "h", "i", "j", "k" };
JList list = new JList(label);JList list = new JList(label);
JScrollPane pane = new JScrollPane(list); JScrollPane pane = new JScrollPane(list);
JList : SélectionJList : Sélection
static Vector v; static Vector v;
l = new JList(v);l = new JList(v);
l.setSelectionMode(l.setSelectionMode(
ListSelectionModel.SINGLE_SELECTION);ListSelectionModel.SINGLE_SELECTION);
// SINGLE_INTERVAL_SELECTION// SINGLE_INTERVAL_SELECTION
// MULTIPLE_INTERVAL_SELECTION// MULTIPLE_INTERVAL_SELECTION
Modification dynamique de JListModification dynamique de JList
//Schéma Modèle/Vue(s)/Controleur//Schéma Modèle/Vue(s)/ControleurlistModel = new DefaultListModel(); listModel = new DefaultListModel(); listModel.addElement("A"); listModel.addElement("A"); listModel.addElement("B"); listModel.addElement("B"); listModel.addElement("C"); listModel.addElement("C");
JList list = new JList(listModel); JList list = new JList(listModel); ...... listModel.remove(index); listModel.remove(index);
listSelectionListenerlistSelectionListener
public void valueChanged(ListSelectionEvent e) {public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) return;if (e.getValueIsAdjusting()) return;
JList theList = (JList)e.getSource();JList theList = (JList)e.getSource(); if (theList.isSelectionEmpty()) {if (theList.isSelectionEmpty()) { ...... } else {} else { int index = theList.getSelectedIndex();int index = theList.getSelectedIndex(); ...... }}}}
BordersBordersJButton b = new JButton("Empty"); b.setBorder (new EmptyBorder (1,1,1,1));JButton b = new JButton("Empty"); b.setBorder (new EmptyBorder (1,1,1,1)); b = new JButton ("Etched"); b.setBorder (new EtchedBorder ());b = new JButton ("Etched"); b.setBorder (new EtchedBorder ());
b = new JButton ("ColorizedEtched"); b.setBorder (new EtchedBorder (Color.red, b = new JButton ("ColorizedEtched"); b.setBorder (new EtchedBorder (Color.red, Color.green));Color.green));
b = new JButton ("Titled/Line");b = new JButton ("Titled/Line");b.setBorder(new TitledBorder (b.setBorder(new TitledBorder ( new TitledBorder(LineBorder.createGrayLineBorder(),"Hello"), "World",new TitledBorder(LineBorder.createGrayLineBorder(),"Hello"), "World", TitledBorder.RIGHT, TitledBorder.BOTTOM));TitledBorder.RIGHT, TitledBorder.BOTTOM));
b = new JButton ("Bevel Up"); b.setBorder(new b = new JButton ("Bevel Up"); b.setBorder(new BevelBorder(BevelBorder.RAISED));BevelBorder(BevelBorder.RAISED));
b = new JButton ("Bevel Down"); b.setBorder(new b = new JButton ("Bevel Down"); b.setBorder(new BevelBorder(BevelBorder.LOWERED)); BevelBorder(BevelBorder.LOWERED));
BordersBorders (2) (2)
SoftBevelBorder(SoftBevelBorder.RAISED);SoftBevelBorder(SoftBevelBorder.RAISED);
SoftBevelBorder(SoftBevelBorder.LOWERED);SoftBevelBorder(SoftBevelBorder.LOWERED); MatteBorder(5, 10, 5, 10, Color.red);MatteBorder(5, 10, 5, 10, Color.red); Icon icon = new ImageIcon ("file.gif");Icon icon = new ImageIcon ("file.gif"); new MatteBorder(10, 10, 10, 10, icon));new MatteBorder(10, 10, 10, 10, icon)); BevelBorder(BevelBorder.RAISED, Color.red, Color.pink));BevelBorder(BevelBorder.RAISED, Color.red, Color.pink)); CompoundBorder(CompoundBorder( new MyBorder(Color.red), new MyBorder(Color.red), new CompoundBorder (new MyBorder(Color.green),new CompoundBorder (new MyBorder(Color.green), new MyBorder(Color.blue)));new MyBorder(Color.blue)));
MenusMenus
JMenuBar jmb = new JMenuBar();JMenuBar jmb = new JMenuBar();JMenu file = new JMenu ("File");JMenu file = new JMenu ("File");file.addMenuListener (new MenuListener() {file.addMenuListener (new MenuListener() { public void menuSelected (MenuEvent e) { ... }public void menuSelected (MenuEvent e) { ... } public void menuDeselected (MenuEvent e) { ... }public void menuDeselected (MenuEvent e) { ... } public void menuCanceled (MenuEvent e) { ... }public void menuCanceled (MenuEvent e) { ... }});}); JMenuItem item;JMenuItem item;file.add (item = new JMenuItem ("New"));file.add (item = new JMenuItem ("New"));file.add (item = new JMenuItem ("Open"))file.add (item = new JMenuItem ("Open"))file.addSeparator();file.addSeparator();file.add (item = new JMenuItem ("Close"));file.add (item = new JMenuItem ("Close"));jmb.add (file);jmb.add (file);
......
setJMenuBar (jmb);setJMenuBar (jmb);
Callbacks sur menu itemsCallbacks sur menu items
menuItem.addActionListener(this);menuItem.addActionListener(this);
......
//JRadioButtonMenuItem: //JRadioButtonMenuItem:
rbMenuItem.addActionListener(this);rbMenuItem.addActionListener(this);
......
//JCheckBoxMenuItem: //JCheckBoxMenuItem:
cbMenuItem.addItemListener(this);cbMenuItem.addItemListener(this);
Sous menusSous menus
//submenu//submenusubmenu = new JMenu("A submenu");submenu = new JMenu("A submenu");submenu.setMnemonic(KeyEvent.VK_S);submenu.setMnemonic(KeyEvent.VK_S);
menuItem = new JMenuItem("dans le sous menu");menuItem = new JMenuItem("dans le sous menu");menuItem.setAccelerator(KeyStroke.getKeyStroke(menuItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_2, ActionEvent.ALT_MASK));KeyEvent.VK_2, ActionEvent.ALT_MASK));submenu.add(menuItem);submenu.add(menuItem);
......menu.add(submenu);menu.add(submenu);
JPopupMenuJPopupMenu
public class PopupPanel extends JPanel {public class PopupPanel extends JPanel { JPopupMenu popup = new JPopupMenu ();JPopupMenu popup = new JPopupMenu (); public PopupPanel() {public PopupPanel() {
popup.add (new JMenuItem ("Cut"));popup.add (new JMenuItem ("Cut")); ......
popup.setInvoker (this); popup.setInvoker (this);
addMouseListener (new MouseAdapter() {addMouseListener (new MouseAdapter() { public void mousePressed (MouseEvent e) {public void mousePressed (MouseEvent e) { if (e.isPopupTrigger()) {if (e.isPopupTrigger()) { popup.show (e.getComponent(), e.getX(), e.getY());popup.show (e.getComponent(), e.getX(), e.getY()); } }} } public void mouseReleased (MouseEvent e) {public void mouseReleased (MouseEvent e) { if (e.isPopupTrigger()) {if (e.isPopupTrigger()) { popup.show (e.getComponent(), e.getX(), e.getY());popup.show (e.getComponent(), e.getX(), e.getY()); } } }); }} } }); }
Hiérarchie des FenêtresHiérarchie des Fenêtres La hiérarchie des classes fenêtre Swing s'intègre sous la classe La hiérarchie des classes fenêtre Swing s'intègre sous la classe
Windows de AWTWindows de AWT
Elles ne sont donc pas "lightweight", sont associées à une fenêtre Elles ne sont donc pas "lightweight", sont associées à une fenêtre graphique, et ne peuvent pas être transparentes. graphique, et ne peuvent pas être transparentes.
On peut utiliser setJMenuBar(). On peut utiliser setJMenuBar().
De même que pour JWindow et JDialog, on doit ajouter les éléments à De même que pour JWindow et JDialog, on doit ajouter les éléments à un container obtenu par getContentPane()un container obtenu par getContentPane()
JFrame et CloseJFrame et Close Contrairement à Frame, JFrame se ferme Contrairement à Frame, JFrame se ferme
sur "close".sur "close".
setDefaultCloseOperation() : setDefaultCloseOperation() : • DO_NOTHING_ON_CLOSE: comme AWT DO_NOTHING_ON_CLOSE: comme AWT • HIDE_ON_CLOSE: le défaut (setVisible(true) HIDE_ON_CLOSE: le défaut (setVisible(true)
remappe la fenêtre) remappe la fenêtre) • DISPOSE_ON_CLOSE: récupère les ressourcesDISPOSE_ON_CLOSE: récupère les ressources
HIDE_ON_CLOSE et DISPOSE_ON_CLOSE HIDE_ON_CLOSE et DISPOSE_ON_CLOSE laissent s'exécuter les event listenerslaissent s'exécuter les event listeners
JRootPaneJRootPane
Le dispositif d'affichage d'un JFrame est un Le dispositif d'affichage d'un JFrame est un JRootPane, composé de deux objets : un JRootPane, composé de deux objets : un glass pane et un layered pane. glass pane et un layered pane.
Le glass pane est invisible, mais toujours Le glass pane est invisible, mais toujours devant le layered pane, et permet devant le layered pane, et permet l'affichage des tooltips et des popups l'affichage des tooltips et des popups
Le layered pane est constitué d'un Le layered pane est constitué d'un menubar optionnel, et d'un content pane, menubar optionnel, et d'un content pane, utilisé habituellement utilisé habituellement
JLayeredPaneJLayeredPane
Le JLayeredPane permet d'afficher des Le JLayeredPane permet d'afficher des composants dans des couches différentes, ce qui composants dans des couches différentes, ce qui permet des superpositions: permet des superpositions:
layeredPane.add (component, new Integer(5));layeredPane.add (component, new Integer(5));
Le défaut est JLayeredPane.DEFAULT_LAYER. Le défaut est JLayeredPane.DEFAULT_LAYER.
On peut placer des objets relativement à cette On peut placer des objets relativement à cette couche, devant ou derrièrecouche, devant ou derrière
Le LayoutManager détermine l'ordre d'affichage, Le LayoutManager détermine l'ordre d'affichage, et empêche les superpositions au sein d'une et empêche les superpositions au sein d'une même couche. même couche.
TooltipsTooltips
public class TooltipPanel extends JPanel {public class TooltipPanel extends JPanel {
public TooltipPanel() {public TooltipPanel() {
JButton myButton = new JButton("Hello");JButton myButton = new JButton("Hello");
myButton.setToolTipText ("World");myButton.setToolTipText ("World");
add(myButton);add(myButton); }}}}
ToolbarsToolbars JToolbar est un container qui permet d'afficher JToolbar est un container qui permet d'afficher
des toolbars déplaçables, éventuellement dans des toolbars déplaçables, éventuellement dans d'autres containers que celui d'origine. d'autres containers que celui d'origine. L'affichage du toolbar passe de vertical à L'affichage du toolbar passe de vertical à horizontal suivant son emplacement.horizontal suivant son emplacement.
On peut désactiver la possibilité de rendre les On peut désactiver la possibilité de rendre les toolbars flottantes.toolbars flottantes.
aToolBar.setFloatable (false);aToolBar.setFloatable (false);
JTabbedPaneJTabbedPane JTabbedPane permet de réaliser des JTabbedPane permet de réaliser des
interfaces à onglets. interfaces à onglets. On ajoute les onglets (des "cards") avec On ajoute les onglets (des "cards") avec
addTab(). Une des versions permet addTab(). Une des versions permet l'affichage d'un tooltipl'affichage d'un tooltip
N'importe quel Component peut être affiché N'importe quel Component peut être affiché dans un ongletdans un onglet• addTab(String title, Component component)addTab(String title, Component component)• addTab(String title, Icon icon, Component addTab(String title, Icon icon, Component
component) component) • addTab(String title, Icon icon, Component addTab(String title, Icon icon, Component
component, String tip)component, String tip)
JSplitPaneJSplitPane
JSplitPane permet le redimensionnement réciproque de JSplitPane permet le redimensionnement réciproque de deux fenêtres deux fenêtres
On peut placer un JSplitPane dans un autre : c'est un moyen On peut placer un JSplitPane dans un autre : c'est un moyen de faire des interfaces compliquées sans gérer les layouts de faire des interfaces compliquées sans gérer les layouts
setContinuousLayout permet de voir le redimensionnement setContinuousLayout permet de voir le redimensionnement en direct en direct
On peut changer par programme la "dividerLocation"On peut changer par programme la "dividerLocation"
BoxLayoutBoxLayout Le BoxLayout layout arrange les composants selon l'axe Le BoxLayout layout arrange les composants selon l'axe
horizontal ou vertical, mais plus intelligemment que le grid horizontal ou vertical, mais plus intelligemment que le grid layout : les épaisseurs ou largeurs peuvent varierlayout : les épaisseurs ou largeurs peuvent varier
Il centre les composants ne pouvant pas être redimensionnésIl centre les composants ne pouvant pas être redimensionnés
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
Le premier paramètre spécifie le container (JPanel par ex), et Le premier paramètre spécifie le container (JPanel par ex), et le second l'axe du BoxLayout. On ajoute les composants le second l'axe du BoxLayout. On ajoute les composants comme d'habitudecomme d'habitude
add(myComponent);add(myComponent);
BoxLayoutBoxLayout
Par ailleurs, BoxLayout permet de lier Par ailleurs, BoxLayout permet de lier relativement des composants relativement des composants consécutifs :consécutifs :
En les « collant »,En les « collant », Et en introduisant des séparateurs Et en introduisant des séparateurs
invisiblesinvisibles
BoxLayoutBoxLayout
//Alignement des boutons//Alignement des boutons
JPanel buttonPane = new JPanel();JPanel buttonPane = new JPanel();
buttonPane.setLayout(new BoxLayout(buttonPane, buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));BoxLayout.LINE_AXIS));
buttonPane.setBorder(BorderFactory.createEmptyBorderbuttonPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));(0, 10, 10, 10));
buttonPane.add(Box.createHorizontalGlue());buttonPane.add(Box.createHorizontalGlue());
buttonPane.add(cancelButton);buttonPane.add(cancelButton);
buttonPane.add(Box.createRigidArea(new Dimension(10, buttonPane.add(Box.createRigidArea(new Dimension(10, 0)));0)));
buttonPane.add(setButton);buttonPane.add(setButton);
Nouveautés majeures de Java 5Nouveautés majeures de Java 5
cf cf http://java.sun.com/j2se/1.5.0/docs/guide/swing/1.5/index.htmlhttp://java.sun.com/j2se/1.5.0/docs/guide/swing/1.5/index.html
look and feel par défaut améliorélook and feel par défaut amélioré introduction d'un nouveau look and feel introduction d'un nouveau look and feel
skinnable sans changer le code: "synth"skinnable sans changer le code: "synth" gestion directe des popup menus (avec gestion directe des popup menus (avec
héritage)héritage) support de l'impression sur JTablesupport de l'impression sur JTable
Nouveautés de Java5 - TexteNouveautés de Java5 - Texte JTextArea ne scrolle plus automatiquement JTextArea ne scrolle plus automatiquement
quand on ajoute du textequand on ajoute du texte HTMLEditorKit a été amélioré pour HTMLEditorKit a été amélioré pour
intercepter les évènements des intercepter les évènements des formulaires avant que les paramètres formulaires avant que les paramètres "post" ne soient transmis"post" ne soient transmis
Interrogation du caractère "actif" du Interrogation du caractère "actif" du curseur ("visible" ne convient pas s'il curseur ("visible" ne convient pas s'il clignote...)clignote...)
Gestion de la couleur de fond améliorée Gestion de la couleur de fond améliorée dans LabelViewdans LabelView
ConclusionConclusion
C'était un point de départ pour Javax C'était un point de départ pour Javax SwingSwing
De la pratique maintenant.De la pratique maintenant.
Doc en ligne (référence et exemples) Doc en ligne (référence et exemples) sur http://www.javasoft.comsur http://www.javasoft.com