+ All Categories
Home > Documents > Java Swing Eléments de Base - Laurent Henocquelaurent.henocque.com/oldsite/doc/Cours Java Swing...

Java Swing Eléments de Base - Laurent Henocquelaurent.henocque.com/oldsite/doc/Cours Java Swing...

Date post: 10-Sep-2018
Category:
Upload: lyliem
View: 239 times
Download: 0 times
Share this document with a friend
67
Java Swing Java Swing Eléments Eléments de Base de Base ESIL ESIL Laurent Henocque Laurent Henocque Cours mis Cours mis à jour en à jour en Février Février 2008 2008
Transcript

Java SwingJava SwingEléments Eléments de Basede Base

ESILESILLaurent HenocqueLaurent Henocque

Cours mis Cours mis à jour en à jour en FévrierFévrier20082008

Licence Creative CommonsLicence Creative Commons

Cette création est mise Cette création est mise à disposition à disposition selonselonle le Contrat Paternité-Partage Contrat Paternité-Partage desdesConditions Conditions Initiales Initiales à à l'Identique l'Identique 2.02.0France France disponible disponible en en ligneligne

http:http://creativecommons//creativecommons.org/licenses/by-.org/licenses/by-sa/2.0/fr/sa/2.0/fr/

ou ou par par courrier courrier postal à Creativepostal à CreativeCommons, 559 Nathan Abbott Way,Commons, 559 Nathan Abbott Way,Stanford, California 94305, USA.Stanford, California 94305, USA.

IntroductionIntroduction

Swing Swing est est la la bibliothèque bibliothèque JavaJavaperformante performante pour la pour la réalisation réalisation desdesinterfaces interfaces homme homme machine.machine.

Swing Swing est actuellement est actuellement en en compétitioncompétitionavec SWT (Eclipse) et avec SWT (Eclipse) et bientôt bientôt Flash etFlash etJavascript Javascript (adobe flex et air)(adobe flex et air)

http://java.sun.http://java.sun.com/docs/books/tutorial/ucom/docs/books/tutorial/uiswing/indexiswing/index.html.html

Présentation très rapidePrésentation très rapidedes conceptsdes concepts

Création d'une classe Création d'une classe "frame""frame"import import javaxjavax.swing..swing.JFrameJFrame;;

public class public class MainFrame MainFrame extendsextendsJFrameJFrame{{ public public MainFrameMainFrame()() { { super("My title");super("My title"); setSizesetSize(300, 300);(300, 300); }}}}

Création d'une Création d'une applicationapplicationpublic 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

setDefaultCloseOperationsetDefaultCloseOperation(( JFrameJFrame.EXIT_ON_CLOSE);.EXIT_ON_CLOSE);

Container content = Container content = getContentPanegetContentPane();();content.add(new content.add(new JButtonJButton("Button 1")); ("Button 1"));

Ajout Ajout de de composantscomposants

Grouper des Grouper des composantscomposants

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 Gérer le le Positionnement Positionnement VariableVariable

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 layoutspanel=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 Evénements (version 2)(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 Présentation de lade laBibliothèqueBibliothèque

Squelette dSquelette d’’application application SwingSwingimport java.import java.awtawt.*;.*;import java.import java.awtawt.event.*;.event.*;import import javaxjavax.swing.*;.swing.*;public class public class JWinApp JWinApp extends extends JFrameJFrame{{

public public JWinAppJWinApp(String title, (String title, JPanel JPanel panel){panel){super(title);super(title);getContentPanegetContentPane().add(panel, ().add(panel, BorderLayoutBorderLayout.CENTER);.CENTER);setSizesetSize(200,200);(200,200);addWindowListeneraddWindowListener(new (new WindowAdapterWindowAdapter(){(){

public void public void windowClosingwindowClosing((WindowEvent WindowEvent we){we){exitAppexitApp(); }(); } });});}}protected void protected void exitAppexitApp(){(){

setVisiblesetVisible(false);(false);dispose();dispose();System.exit(0);System.exit(0);

}}public static void main(String public static void main(String argsargs[]) { new[]) { newJWinAppJWinApp((……).).setVisiblesetVisible(true); }(true); }

}}

Hello WorldHello World

class class WinHelloPanel WinHelloPanel extends extends JPanel JPanel implementsimplementsActionListenerActionListener{{JLabel JLabel label = new label = new JLabelJLabel("Hello World "); // un label("Hello World "); // un labelJButton JButton button = new button = new JButtonJButton("Click!"); // un ("Click!"); // un boutonboutonpublic public WinHelloPanelWinHelloPanel(){(){

add(label);add(label);add(button);add(button);button.button.addActionListeneraddActionListener(this);(this);

}}public void public void actionPerformedactionPerformed((ActionEvent aeActionEvent ae){){

JOptionPaneJOptionPane..showMessageDialogshowMessageDialog(this, "Thanks for(this, "Thanks forClicking.");Clicking.");}}

}}

Widgets Widgets commecomme AWTAWT

WidgetsWidgetsSwingSwing

JPanelJPanel

CC’’est est un Panel un Panel léger offrant léger offrant ununsupport pour le double bufferingsupport pour le double buffering(technique (technique dd’’affichage affichage en en deuxdeuxtemps temps permettant dpermettant d’é’éviter viter leslesscintillements scintillements et et défaut ddéfaut d’’aspectsaspects))

Quand Quand le buffering le buffering est activéest activé((constructeurconstructeur) ) tous tous les les composantscomposantsse se dessinent ddessinent d’’abord dans abord dans un bufferun buffernon non affichéaffiché

IconesIcones

Les Les icones sont utilisées icones sont utilisées avec avec tous tous les les boutons ouboutons ouautres composantsautres composants..

public interface Icon {public interface Icon { void void paintIconpaintIcon(Component c, Graphics g, (Component c, Graphics g, int int x, x, int int y);y); int getIconWidthint getIconWidth();(); int getIconHeightint getIconHeight();();}}

ll’’argument argument ““cc”” sert sert à à fournir une fournir une informationinformationcomplémentaire complémentaire au moment au moment du dessin du dessin (police, (police, couleurcouleur))

x et y x et y spécifient lspécifient l’’origine du dessinorigine du dessin

ImageIconImageIcon

Icon i = new Icon i = new ImageIconImageIcon((““Image.gif");Image.gif");

Icon j = new Icon j = new ImageIconImageIcon((

new URL(new URL(““http://http://……Image.gifImage.gif””));));

Avantages Avantages ::•• url ou fichierurl ou fichier,,

•• chargement asynchrone chargement asynchrone : pas de : pas de blocage blocage dedell’’interfaceinterface

•• ll’’image nimage n’’est est pas pas sérializablesérializable

Créer sa propre iconeCréer sa propre icone

public class public class RedOval RedOval implements Icon {implements Icon { public void public void paintIcon paintIcon ((

Component c, Graphics g, Component c, Graphics g, int int x, x, int int y) {y) { g. g.setColorsetColor((ColorColor.red);.red); g. g.drawOval drawOval (x, y, (x, y, getIconWidthgetIconWidth(),(),

getIconHeightgetIconHeight());()); } } public public int getIconWidthint getIconWidth() { return 10; }() { return 10; } public public int getIconHeightint getIconHeight() { return 10; }() { return 10; }}}

JLabelJLabelpublic class public class LabelPanel LabelPanel extends extends JPanel JPanel {{ public public LabelPanelLabelPanel() {() { JLabel plainLabel JLabel plainLabel = new = new JLabelJLabel("Petit Label");("Petit Label"); add( add(plainLabelplainLabel););

JLabel fancyLabel JLabel fancyLabel = new = new JLabelJLabel(« Super Beau Label");(« Super Beau Label"); Font Font fancyFont fancyFont = new Font("Serif", Font.BOLD |= new Font("Serif", Font.BOLD |

Font.ITALIC, 32);Font.ITALIC, 32); fancyLabelfancyLabel..setFontsetFont((fancyFontfancyFont););

Icon Icon tigerIcon tigerIcon = new = new ImageIconImageIcon(("SmallTiger"SmallTiger.gif");.gif"); fancyLabelfancyLabel..setIconsetIcon((tigerIcontigerIcon);); fancyLabelfancyLabel..setHorizontalAlignmentsetHorizontalAlignment((JLabelJLabel.RIGHT);.RIGHT); add( add(fancyLabelfancyLabel);); } }}}

JButtonJButton

public class public class ButtonPanel ButtonPanel extends extends JPanel JPanel {{ public public ButtonPanelButtonPanel() {() { Icon Icon tigerIcon tigerIcon = new = new ImageIconImageIcon(("SmallTiger"SmallTiger.gif");.gif"); JButton myButton JButton myButton = new = new JButtonJButton("Tiger", ("Tiger", tigerIcontigerIcon);); add( add(myButtonmyButton);); } }}}

AbstractButtonAbstractButton Plusieurs Plusieurs classes Swing classes Swing implémentent abstractButtonimplémentent abstractButton

setMnemonicsetMnemonic() () –– accélérateur accélérateur clavier : les clavier : les constantes constantes VK_* de VK_* de KeyEventKeyEvent

doClickdoClick() () –– appel du bouton appel du bouton par programmepar programme

setDisabledIconsetDisabledIcon(), (), setDisabledSelectedIconsetDisabledSelectedIcon(), (), setPressedIconsetPressedIcon(),(),setRolloverIconsetRolloverIcon(), (), setRolloverSelectedIconsetRolloverSelectedIcon(), (), setSelectedIconsetSelectedIcon() () ––modifications modifications dynamique dynamique de de ll’’iconeicone

setVerticalAlignmentsetVerticalAlignment(), (), setHorizontalAlignemntsetHorizontalAlignemnt()()

setVerticalTextPositionsetVerticalTextPosition(), (), setHorizontalTextPositionsetHorizontalTextPosition() () –– place le place le texte texte parparrapport à rapport à ll’’iconeicone

On On peut spécifier peut spécifier le le texte du texte du label en html (<html> label en html (<html> …… <html>) à <html>) à partir partir dedeswing 1.1.1)swing 1.1.1)

JCheckBoxJCheckBoxclassclass CheckboxPanel CheckboxPanel extendsextends JPanel JPanel {{

Icon no = Icon no = newnew ToggleIcon ToggleIcon ((falsefalse);); Icon yes = Icon yes = newnew ToggleIcon ToggleIcon ((truetrue););

publicpublic CheckboxPanelCheckboxPanel() {() {

setLayoutsetLayout((newnew GridLayoutGridLayout(2, 1));(2, 1));

JCheckBox JCheckBox cb1 = cb1 = newnewJCheckBoxJCheckBox("Choose Me", ("Choose Me", truetrue););

cb1. cb1.setIconsetIcon(no);(no); cb1. cb1.setSelectedIconsetSelectedIcon(yes);(yes);

JCheckBox JCheckBox cb2 = cb2 = newnewJCheckBoxJCheckBox("No Choose Me", ("No Choose Me", falsefalse););

cb2. cb2.setIconsetIcon(no);(no); cb2. cb2.setSelectedIconsetSelectedIcon(yes);(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 paintIcon (Component c,(Component c,Graphics g, Graphics g, intint x, x, intint y) {y) {

intint width = width = getIconWidthgetIconWidth();(); intint height = height = getIconHeightgetIconHeight();(); g. g.setColor setColor ((ColorColor.black);.black); ifif (state) g. (state) g.fillRect fillRect (x, y, width,(x, y, width,

height);height); elseelse g. g.drawRect drawRect (x, y, width,(x, y, width,

height);height); } }

publicpublic intint getIconWidth getIconWidth() { () { returnreturn10; }10; }

publicpublic intint getIconHeight getIconHeight() { () { returnreturn10; }10; }

} }}}

JRadioButtonJRadioButtonclass class RadioButtonPanel RadioButtonPanel extends extends JPanel JPanel {{public public RadioButtonPanelRadioButtonPanel() {() { setLayoutsetLayout(new (new GridLayoutGridLayout(4,1));(4,1)); JRadioButton radioButtonJRadioButton radioButton;; ButtonGroup rbg ButtonGroup rbg = new = new ButtonGroupButtonGroup();(); JLabel JLabel label = new label = new JLabelJLabel("Annual Salary: ");("Annual Salary: "); label. label.setFontsetFont(new Font((new Font("SansSerif""SansSerif", Font.BOLD,, Font.BOLD,

14));14)); add(label); add(label);

radioButton radioButton = new = new JRadioButtonJRadioButton("$45,000");("$45,000"); radioButtonradioButton..setMnemonic setMnemonic ((KeyEventKeyEvent.VK_4);.VK_4); add ( add (radioButtonradioButton); ); rbgrbg.add (.add (radioButtonradioButton);); radioButtonradioButton..setSelectedsetSelected(true);(true);

radioButton radioButton = new = new JRadioButtonJRadioButton("$60,000");("$60,000"); radioButtonradioButton..setMnemonic setMnemonic ((KeyEventKeyEvent.VK_6);.VK_6); add ( add (radioButtonradioButton); ); rbgrbg.add (.add (radioButtonradioButton);); ... ...}}

JToggleButtonJToggleButtonclass class ToggleButtonPanel ToggleButtonPanel extends extends JPanel JPanel {{

public public ToggleButtonPanelToggleButtonPanel() {() {

// Set the layout to a // Set the layout to a GridLayoutGridLayout

setLayout setLayout(new (new GridLayoutGridLayout(4,1, 10, 10));(4,1, 10, 10));

add (new add (new JToggleButton JToggleButton ("Fe"));("Fe")); add (new add (new JToggleButton JToggleButton (("Fi""Fi"));)); add (new add (new JToggleButton JToggleButton (("Fo""Fo"));)); add (new add (new JToggleButton JToggleButton (("Fum""Fum"));)); } }}}

Méthodes Méthodes de de JTextComponentJTextComponent

copy()copy() cut()cut() paste()paste() getSelectedTextgetSelectedText()() setSelectionStartsetSelectionStart()() setSelectionEndsetSelectionEnd()() selectAllselectAll()() replaceSelectionreplaceSelection()() getTextgetText()() setTextsetText()() setEditablesetEditable()() setCaretPositionsetCaretPosition()()

JTextFieldJTextField & & JTextAreaJTextArea

JTextField tf JTextField tf = new = new JTextFieldJTextField();();

JTextArea ta JTextArea ta = new = new JTextAreaJTextArea();();

tftf..setTextsetText(("TextField""TextField"););

tata..setTextsetText(("JTextArea\n "JTextArea\n Multi Multi Lignes"Lignes"););

add(add(tftf););

add(new add(new JScrollPaneJScrollPane((tata)); // scroll au )); // scroll au cas oùcas où

JTextPaneJTextPane

JTextPane est JTextPane est un un éditeur éditeur de de texte complet texte complet (avec(avecinsertions insertions dd’’imagesimages). Il ). Il ss’’appuie sur une liste appuie sur une liste dedeblocs blocs dotés dotés de stylesde styles

JTextPane tp JTextPane tp = new = new JTextPaneJTextPane();();

MutableAttributeSet attr MutableAttributeSet attr = new= newSimpleAttributeSetSimpleAttributeSet();();

StyleConstantsStyleConstants..setFontFamilysetFontFamily((attrattr, "Serif");, "Serif"); StyleConstantsStyleConstants..setFontSizesetFontSize((attrattr, 18);, 18); StyleConstantsStyleConstants..setBoldsetBold((attrattr, true);, true); tptp..setCharacterAttributessetCharacterAttributes((attrattr, false);, false); add(new add(new JScrollPaneJScrollPane((tptp));));

JTextPane exempleJTextPane exempleclass class TextPanel TextPanel extends extends JPanel JPanel {{

public public TextPanelTextPanel() {() { setLayoutsetLayout(new (new BorderLayoutBorderLayout());());

JTextField textField JTextField textField = new = new JTextFieldJTextField();(); JTextArea textArea JTextArea textArea = new = new JTextAreaJTextArea();(); JTextPane textPane JTextPane textPane = new = new JTextPaneJTextPane();();

MutableAttributeSet attr MutableAttributeSet attr = new = new SimpleAttributeSetSimpleAttributeSet();(); StyleConstantsStyleConstants..setFontFamilysetFontFamily((attrattr, "Serif");, "Serif"); StyleConstantsStyleConstants..setFontSizesetFontSize((attrattr, 18);, 18); StyleConstantsStyleConstants..setBoldsetBold((attrattr, true);, true); textPanetextPane..setCharacterAttributessetCharacterAttributes((attrattr, false);, false);

add( add(textFieldtextField, , BorderLayoutBorderLayout.NORTH);.NORTH); add(new add(new JScrollPaneJScrollPane((textAreatextArea), ), BorderLayoutBorderLayout.CENTER);.CENTER); add(new add(new JScrollPaneJScrollPane((textPanetextPane), ), BorderLayoutBorderLayout.SOUTH);}}.SOUTH);}}

JPasswordFieldJPasswordFieldclass class PasswordPanel PasswordPanel extends extends JPanel JPanel {{ PasswordPanelPasswordPanel() {() { JPasswordField JPasswordField p1 = newp1 = new

JPasswordFieldJPasswordField(20);(20); JPasswordField JPasswordField p2 = newp2 = new

JPasswordFieldJPasswordField(20);(20); p2. p2.setEchoChar setEchoChar ('?');('?'); add(p1); add(p1); add(p2); add(p2);}}}}

JEditorPaneJEditorPane

JEditorPane est JEditorPane est un un éditeur éditeur de de textestextes permettant lpermettant l’’affichage affichage de de contenucontenu

html, html, ou ou rtf, rtf, identifié identifié par par une une URL,URL, et et permettant permettant de de suivre suivre les liensles liens

SourceSourceclass Browser extends class Browser extends JPanel JPanel {{ Browser() { Browser() { setLayout setLayout (new (new BorderLayout BorderLayout (5, 5));(5, 5)); final final JEditorPane jt JEditorPane jt = new = new JEditorPaneJEditorPane();(); final final JTextField JTextField input = new input = new JTextFieldJTextField("http://java.sun.com");("http://java.sun.com"); jtjt..setEditablesetEditable(false);(false);

// // suivre suivre les liens :les liens : jtjt..addHyperlinkListeneraddHyperlinkListener(new (new HyperlinkListener HyperlinkListener () {() { public void public void hyperlinkUpdatehyperlinkUpdate(final (final HyperlinkEvent HyperlinkEvent e) {e) { if (e. if (e.getEventTypegetEventType() == () == HyperlinkEventHyperlinkEvent..EventTypeEventType.ACTIVATED) {.ACTIVATED) { SwingUtilitiesSwingUtilities..invokeLaterinvokeLater(new (new RunnableRunnable() {() { public void run() { Document doc = public void run() { Document doc = jtjt..getDocumentgetDocument();(); try { URL try { URL url url = e.= e.getURLgetURL(); (); jtjt..setPagesetPage((urlurl););

input. input.setText setText ((urlurl..toStringtoString());()); } catch ( } catch (IOException ioIOException io) {) { JOptionPaneJOptionPane..showMessageDialog showMessageDialog (( Browser.this, "Can't follow link", "Invalid Input", Browser.this, "Can't follow link", "Invalid Input", JOptionPaneJOptionPane.ERROR_MESSAGE);.ERROR_MESSAGE); jtjt..setDocument setDocument (doc);}}});(doc);}}});}}});}}});

suitesuiteJScrollPane JScrollPane pane = new pane = new JScrollPaneJScrollPane();(); pane. pane.setBorder setBorder (( BorderFactoryBorderFactory..createLoweredBevelBordercreateLoweredBevelBorder());()); pane. pane.getViewportgetViewport().add(().add(jtjt);); add(pane, add(pane, BorderLayoutBorderLayout.CENTER);.CENTER); input. input.addActionListener addActionListener (new (new ActionListenerActionListener() {() { public void public void actionPerformed actionPerformed ((ActionEvent ActionEvent e) {e) { try { try { jtjt..setPage setPage (input.(input.getTextgetText()); }()); }

catch ( catch (IOException IOException ex) {ex) { JOptionPaneJOptionPane..showMessageDialog showMessageDialog (( Browser.this, "Invalid URL", "Invalid Browser.this, "Invalid URL", "Invalid

Input",Input", JOptionPaneJOptionPane.ERROR_MESSAGE); }.ERROR_MESSAGE); } } }); } }); add (input, add (input, BorderLayoutBorderLayout.SOUTH);}}.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 JSlider et Labelset 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 BarCré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 ComboBoxpublic 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 JList : : SélectionSélectionstatic 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 Modification dynamique dynamique de de JListJList

//Schéma Modèle/Vue//Schéma Modèle/Vue(s)(s)/Controleur/ControleurlistModel listModel = new = new DefaultListModelDefaultListModel();();listModellistModel..addElementaddElement("A");("A");listModellistModel..addElementaddElement("B");("B");listModellistModel..addElementaddElement("C");("C");

JList JList list = new list = new JListJList((listModellistModel););...... listModellistModel.remove(index);.remove(index);

listSelectionListenerlistSelectionListenerpublic 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 JButton b = new b = new JButtonJButton("Empty"); b.("Empty"); b.setBorder setBorder (new (new EmptyBorder EmptyBorder (1,1,1,1));(1,1,1,1));

b = new b = new JButton JButton ("Etched"); b.("Etched"); b.setBorder setBorder (new (new EtchedBorder EtchedBorder ());());

b = new b = new JButton JButton (("ColorizedEtched""ColorizedEtched"); b.); b.setBorder setBorder (new (new EtchedBorder EtchedBorder ((ColorColor.red,.red,ColorColor.green));.green));

b = new b = new JButton JButton ("Titled/Line");("Titled/Line");b.b.setBordersetBorder(new (new TitledBorder TitledBorder (( new new TitledBorderTitledBorder((LineBorderLineBorder..createGrayLineBordercreateGrayLineBorder(),"Hello"), "World",(),"Hello"), "World", TitledBorderTitledBorder.RIGHT, .RIGHT, TitledBorderTitledBorder.BOTTOM));.BOTTOM));

b = new b = new JButton JButton ("Bevel Up"); b.("Bevel Up"); b.setBordersetBorder(new(newBevelBorderBevelBorder((BevelBorderBevelBorder.RAISED));.RAISED));

b = new b = new JButton JButton ("Bevel Down"); b.("Bevel Down"); b.setBordersetBorder(new(newBevelBorderBevelBorder((BevelBorderBevelBorder.LOWERED));.LOWERED));

BordersBorders (2) (2)

SoftBevelBorderSoftBevelBorder((SoftBevelBorderSoftBevelBorder.RAISED);.RAISED);

SoftBevelBorderSoftBevelBorder((SoftBevelBorderSoftBevelBorder.LOWERED);.LOWERED);

MatteBorderMatteBorder(5, 10, 5, 10, (5, 10, 5, 10, ColorColor.red);.red);

Icon icon = new Icon icon = new ImageIcon ImageIcon ("file.gif");("file.gif"); new new MatteBorderMatteBorder(10, 10, 10, 10, icon));(10, 10, 10, 10, icon));

BevelBorderBevelBorder((BevelBorderBevelBorder.RAISED, .RAISED, ColorColor.red, .red, ColorColor.pink));.pink));

CompoundBorderCompoundBorder(( new new MyBorderMyBorder((ColorColor.red),.red), new new CompoundBorder CompoundBorder (new (new MyBorderMyBorder((ColorColor.green),.green), new new MyBorderMyBorder((ColorColor.blue)));.blue)));

MenusMenusJMenuBar jmb JMenuBar jmb = new = new JMenuBarJMenuBar();();JMenu JMenu file = new file = new JMenu JMenu ("File");("File");file.file.addMenuListener addMenuListener (new (new MenuListenerMenuListener() {() { public void public void menuSelected menuSelected ((MenuEvent MenuEvent e) { ... }e) { ... } public void public void menuDeselected menuDeselected ((MenuEvent MenuEvent e) { ... }e) { ... } public void public void menuCanceled menuCanceled ((MenuEvent MenuEvent e) { ... }e) { ... }});});

JMenuItem JMenuItem item;item;file.add (item = new file.add (item = new JMenuItem JMenuItem ("New"));("New"));file.add (item = new file.add (item = new JMenuItem JMenuItem ("Open"))("Open"))file.file.addSeparatoraddSeparator();();file.add (item = new file.add (item = new JMenuItem JMenuItem ("Close"));("Close"));jmbjmb.add (file);.add (file);

... ...

setJMenuBar setJMenuBar ((jmbjmb););

Callbacks sur Callbacks sur menu itemsmenu items

menuItem.addActionListener(this);menuItem.addActionListener(this);......//JRadioButtonMenuItem://JRadioButtonMenuItem:rbMenuItem.addActionListener(this);rbMenuItem.addActionListener(this);......//JCheckBoxMenuItem://JCheckBoxMenuItem:cbMenuItem.addItemListener(this);cbMenuItem.addItemListener(this);

Sous Sous menusmenus//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);

JPopupMenuJPopupMenupublic 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 Hiérarchie des des FenêtresFenêtres La hiérarchie des classes fenêtre Swing s'intègre sous la classeLa 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êtreElles ne sont donc pas "lightweight", sont associées à une fenêtregraphique, 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émentsDe même que pour JWindow et JDialog, on doit ajouter les élémentsà un container obtenu par getContentPane()à un container obtenu par getContentPane()

JFrame JFrame et Closeet Close Contrairement à Frame, JFrame se fermeContrairement à Frame, JFrame se ferme

sur "close".sur "close".

setDefaultCloseOperation() :setDefaultCloseOperation() :•• DO_NOTHING_ON_CLOSE: comme AWTDO_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_CLOSEHIDE_ON_CLOSE et DISPOSE_ON_CLOSElaissent s'exécuter les event listenerslaissent s'exécuter les event listeners

JRootPaneJRootPane

Le dispositif d'affichage d'un JFrame estLe dispositif d'affichage d'un JFrame estun JRootPane, composé de deux objets :un JRootPane, composé de deux objets :un glass pane et un layered pane.un glass pane et un layered pane.

Le glass pane est invisible, mais toujoursLe glass pane est invisible, mais toujoursdevant le layered pane, et permetdevant le layered pane, et permetl'affichage des tooltips et des popupsl'affichage des tooltips et des popups

Le layered pane est constitué d'unLe layered pane est constitué d'unmenubar optionnel, et d'un content pane,menubar optionnel, et d'un content pane,utilisé habituellementutilisé habituellement

JLayeredPaneJLayeredPane

Le JLayeredPane permet d'afficher desLe JLayeredPane permet d'afficher descomposants dans des couches différentes, ce quicomposants dans des couches différentes, ce quipermet 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 à cetteOn peut placer des objets relativement à cettecouche, 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'uneet empêche les superpositions au sein d'unemê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 JToolbar est un container qui un container qui permet d'afficherpermet d'afficher

des toolbars des toolbars déplaçablesdéplaçables, , éventuellement danséventuellement dansd'autres d'autres containers containers que celui d'origineque celui d'origine. . L'affichageL'affichagedu du toolbar toolbar passe passe de vertical à horizontal de vertical à horizontal suivantsuivantson emplacement.son emplacement.

On On peut désactiver peut désactiver la la possibilité possibilité de de rendre rendre leslestoolbars toolbars flottantesflottantes..

aToolBaraToolBar..setFloatable setFloatable (false);(false);

JTabbedPaneJTabbedPane JTabbedPane permet de réaliser desJTabbedPane permet de réaliser des

interfaces à onglets.interfaces à onglets. On ajoute les onglets (des "cards") avecOn ajoute les onglets (des "cards") avec

addTab(). Une des versions permetaddTab(). Une des versions permetl'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, ComponentaddTab(String title, Icon icon, Component

component)component)•• addTab(String title, Icon icon, ComponentaddTab(String title, Icon icon, Component

component, String tip)component, String tip)

JSplitPaneJSplitPane

JSplitPane permet le redimensionnement réciproque deJSplitPane permet le redimensionnement réciproque dedeux fenêtresdeux fenêtres

On peut placer un JSplitPane dans un autre : c'est unOn peut placer un JSplitPane dans un autre : c'est unmoyen de faire des interfaces compliquées sans gérer lesmoyen de faire des interfaces compliquées sans gérer leslayoutslayouts

setContinuousLayout permet de voir le redimensionnementsetContinuousLayout permet de voir le redimensionnementen directen direct

On peut changer par programme la "dividerLocation"On peut changer par programme la "dividerLocation"

BoxLayoutBoxLayout Le BoxLayout layout arrange les composants selon l'axeLe BoxLayout layout arrange les composants selon l'axe

horizontal ou vertical, mais plus intelligemment que le gridhorizontal ou vertical, mais plus intelligemment que le gridlayout : 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), etLe premier paramètre spécifie le container (JPanel par ex), etle second l'axe du BoxLayout. On ajoute les composantsle second l'axe du BoxLayout. On ajoute les composantscomme d'habitudecomme d'habitude

add(myComponent);add(myComponent);

BoxLayoutBoxLayout

Par ailleurs, Par ailleurs, BoxLayout BoxLayout permet depermet delier relativement des composantslier relativement des composantsconsécutifs :consécutifs :

En les «En les « collantcollant » »,, Et en introduisant des séparateursEt en introduisant des séparateurs

invisiblesinvisibles

BoxLayoutBoxLayout//Alignement des boutons//Alignement des boutonsJPanel buttonPane JPanel buttonPane = new = new JPanelJPanel();();buttonPanebuttonPane..setLayoutsetLayout(new (new BoxLayoutBoxLayout((buttonPanebuttonPane,,

BoxLayoutBoxLayout.LINE_AXIS));.LINE_AXIS));buttonPanebuttonPane..setBordersetBorder((BorderFactoryBorderFactory..createEmptyBordercreateEmptyBorder

(0, 10, 10, 10));(0, 10, 10, 10));buttonPanebuttonPane..addadd(Box.(Box.createHorizontalGluecreateHorizontalGlue());());buttonPanebuttonPane..addadd((cancelButtoncancelButton););buttonPanebuttonPane..addadd(Box.(Box.createRigidAreacreateRigidArea(new Dimension(10,(new Dimension(10,

0)));0)));buttonPanebuttonPane..addadd((setButtonsetButton););

Nouveautés majeures Nouveautés majeures de Java 5de Java 5

cfcfhttp://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 feelintroduction d'un nouveau look and feel

skinnable sans changer le code: "synth"skinnable sans changer le code: "synth" gestion directe des popup menus (avecgestion directe des popup menus (avec

héritage)héritage) support de l'impression sur JTablesupport de l'impression sur JTable

Nouveautés Nouveautés de Java5 - de Java5 - TexteTexte JTextArea ne scrolle plusJTextArea ne scrolle plus

automatiquement quand on ajoute duautomatiquement quand on ajoute dutextetexte

HTMLEditorKit a été amélioré pourHTMLEditorKit a été amélioré pourintercepter les évènements desintercepter les évènements desformulaires avant que les paramètresformulaires avant que les paramètres"post" ne soient transmis"post" ne soient transmis

Interrogation du caractère "actif" duInterrogation du caractère "actif" ducurseur ("visible" ne convient pas s'ilcurseur ("visible" ne convient pas s'ilclignote...)clignote...)

Gestion de la couleur de fond amélioréeGestion de la couleur de fond amélioréedans LabelViewdans LabelView

ConclusionConclusion

C'était C'était un point de un point de départ départ pour pour JavaxJavaxSwingSwing

De la De la pratique maintenantpratique maintenant..

Doc en Doc en ligne ligne ((référence référence et et exemplesexemples))sur sur http://www.http://www.javasoftjavasoft.com.com


Recommended