Solutions du chapitre 12

publicité
Solutions du chapitre 12
Composants de base de l’interface
utilisateur graphique
12.4
Complétez chacune des propositions suivantes:
a) La classe JTextField hérite directement de
.
RÉP.: JTextComponent.
b) Les gestionnaires de tracé étudiés dans ce chapitre sont:
,
et
.
RÉP.: FlowLayout, BorderLayout et GridLayout.
de Container lie un composant GUI à un conteneur.
c) La méthode
RÉP.: add.
est appelée lors du relâchement d’un bouton de souris, sans déplacement de la souris.
d) La méthode
RÉP.: mouseClicked.
e) La classe
sert à créer un groupe de JRadioButton.
RÉP.: ButtonGroup.
12.5
Établissez si chacune des propositions suivantes est vraie ou fausse. Si elle est fausse, expliquez pourquoi.
a) Il n’est permis de placer qu’un seul gestionnaire de tracé par Container.
RÉP.: Vrai.
b) Les composants GUI s’ajoutent à un Container dans n’importe quel ordre dans un BorderLayout.
RÉP.: Vrai.
c) Les JRadioButton fournissent une série d’options qui s’excluent mutuellement, c’est-à-dire qu’une seule option est
sélectionnable (peut être true) à la fois.
RÉP.: Vrai.
d) La méthode setFont de Graphics sert à imposer la police des zones de texte modifiable.
RÉP.: Faux. La méthode setFont de Component sert à cela.
e) Un JList affiche une barre de défilement si la liste compte plus d’éléments qu’elle ne peut en afficher à la fois.
RÉP.: Faux. Un JList ne fournit jamais de barre de défilement.
f) Un objet Mouse contient une méthode nommée mouseDragged.
RÉP.: Faux. Java ne fournit aucun objet Mouse.
12.6
Établissez si chacune des propositions suivantes est vraie ou fausse. Si elle est fausse, expliquez pourquoi.
a) Un JApplet ne dispose pas de panneau de contenu.
RÉP.: Faux. Un JApplet en dispose d’un.
b) Un JPanel est un JComponent.
RÉP.: Vrai.
c) Un JPanel est un Component.
RÉP.: Vrai.
d) Un JPanel est un Container.
RÉP.: Vrai.
e) Un JList est un JPanel.
RÉP.: Faux. Un JList est un JComponent.
f) Un AbstractButton est un JButton.
RÉP.: Faux. Un JButton est un AbstractButton.
g) Un JTextField est un Object.
RÉP.: Vrai.
h) ButtonGroup hérite de JComponent.
RÉP.: Faux. ButtonGroup hérite de Object.
12.7
Trouvez la (ou les) erreur(s) de chacune des propositions suivantes et expliquez comment la (ou les) corriger.
a) import javax.swing.*
// inclure le package swing.
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
RÉP.: Le point virgule manque après l’astérisque.
b) ObjetDePanneau.GridLayout( 8, 8 ); // définir un GridLayout.
RÉP.: Le constructeur de GridLayout ne peut servir de cette manière. L’instruction correcte serait plutôt:
panelObject.getContentPane().setLayout( new GridLayout( 8, 8 ) );
c) c.setLayout( new FlowLayout( FlowLayout.DEFAULT ) );
RÉP.: La classe FlowLayout ne contient aucune constante static nommée DEFAULT.
d) c.add( eastButton, EAST ); // BorderLayout
RÉP.: L’argument EAST devrait être BorderLayout.EAST.
12.8
Créez l’interface utilisateur graphique suivante. Aucune fonctionnalité n’est nécessaire.
RÉP.:
Note: cet exercice vous est proposé soit comme application (comme dans l’énoncé de l’exercice du livre), soit comme
applet, comme ici. Le cédérom d’accompagnement propose les deux versions. La version application est dans le fichier
AppAlignement.java.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// Solution de l’exercice 12.8.
// Alignement.java
// Ce programme crée un GUI simple.
import javax.swing.*;
import java.awt.*;
public class Alignement extends JApplet {
private JButton ok, annuler, aide;
private JTextField valeurX, valeurY;
private JCheckBox magnetisme, montrer;
private JLabel etiquetteX, etiquetteY;
private JPanel voletCoches, voletBoutons,
voletChamp1, voletChamp2,
voletChamp;
public void init()
{
// Construire le voletCoches.
magnetisme = new JCheckBox( "Magnétisme" );
montrer = new JCheckBox( "Montrer grille" );
voletCoches = new JPanel();
voletCoches.setLayout( new GridLayout( 2 , 1 ) );
voletCoches.add( magnetisme );
voletCoches.add( montrer );
// Construire le volet champs 1.
etiquetteX = new JLabel( "X: " );
valeurX = new JTextField( "8", 3 );
voletChamp1 = new JPanel();
voletChamp1.setLayout( new FlowLayout( FlowLayout.CENTER, 3, 5 ) );
voletChamp1.add( etiquetteX );
voletChamp1.add( valeurX );
etiquetteY = new JLabel( "Y: " );
valeurY = new JTextField( "8", 3 );
voletChamp2 = new JPanel();
voletChamp2.setLayout( new FlowLayout( FlowLayout.CENTER, 3, 5 ) );
voletChamp2.add( etiquetteY );
voletChamp2.add( valeurY );
voletChamp = new JPanel();
voletChamp.setLayout( new BorderLayout() );
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
43
voletChamp.add( voletChamp1, BorderLayout.NORTH );
44
voletChamp.add( voletChamp2, BorderLayout.SOUTH );
45
46
// Construire le volet des boutons.
47
ok = new JButton( "Ok" );
48
annuler = new JButton( "Annuler" );
49
aide = new JButton( "Aide" );
50
voletBoutons = new JPanel();
51
voletBoutons.setLayout( new GridLayout( 3, 1, 10, 5 ) );
52
voletBoutons.add( ok );
53
voletBoutons.add( annuler );
54
voletBoutons.add( aide );
55
56
// Définir le tracé de l’applet.
57
getContentPane().setLayout(
58
new FlowLayout( FlowLayout.CENTER, 10, 5 ) );
59
getContentPane().add( voletCoches );
60
getContentPane().add( voletChamp );
61
getContentPane().add( voletBoutons );
62
}
63 }
12.9
Créez l’interface utilisateur graphique suivante. Aucune fonctionnalité n’est nécessaire.
RÉP.:
Note: cet exercice vous est proposé soit comme application (comme dans l’énoncé de l’exercice du livre), soit comme
applet, comme ici. Le cédérom d’accompagnement propose les deux versions. La version application est dans le fichier AppCalculatrice.java.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// Solution de l’exercice 12.9.
// Calculatrice.java
// Ce programme crée un GUI simple.
// html: largeur = 270 hauteur = 200
import javax.swing.*;
import java.awt.*;
public class Calculatrice extends JApplet {
private JButton touches[];
private JPanel clavier;
private JTextField lcd;
public void init()
{
lcd
= new JTextField( 20 );
clavier = new JPanel();
touches = new JButton[ 16 ];
lcd.setEditable( false );
for ( int i = 0; i <= 9; i++ )
touches[ i ] = new JButton( String.valueOf( i ) );
touches[ 10 ] = new JButton( "/" );
touches[ 11 ] = new JButton( "*" );
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
12.10
touches[
touches[
touches[
touches[
12
13
14
15
]
]
]
]
=
=
=
=
new
new
new
new
JButton(
JButton(
JButton(
JButton(
"-"
"+"
"="
"."
);
);
);
);
// Définir le tracé du clavier comme d’un grid layout.
clavier.setLayout( new GridLayout( 4, 4 ) );
for ( int i = 7; i <= 10; i++ ) // 7, 8, 9, 10
clavier.add( touches[ i ] );
// Division.
for ( int i = 4; i <= 6; i++ ) // 4, 5, 6
clavier.add( touches[ i ] );
clavier.add( touches[ 11 ] );
// Multiplication.
for ( int i = 1; i <= 3; i++ ) // 1, 2, 3
clavier.add( touches[ i ] );
clavier.add( touches[ 12 ] );
// Soustraction.
clavier.add( touches[ 0 ] );
// 0
for ( int i = 15; i >= 13; i-- )
clavier.add( touches[ i ] );
// ., =, ajouter.
// Définir le tracé de l’applet comme un border layout.
getContentPane().setLayout( new BorderLayout() );
getContentPane().add( lcd, BorderLayout.NORTH );
getContentPane().add( clavier, BorderLayout.CENTER );
}
}
Créez l’interface utilisateur graphique suivante. Aucune fonctionnalité n’est nécessaire.
RÉP.:
Note: cet exercice vous est proposé soit comme application (comme dans l’énoncé de l’exercice du livre), soit comme
applet, comme ici. Le cédérom d’accompagnement propose les deux versions. La version application est dans le fichier
AppChoixCouleur.java.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Solution de l’exercice 12.10.
// ChoixCouleur.java
// Ce programme crée un GUI simple.
import javax.swing.*;
import java.awt.*;
public class ChoixCouleur extends JApplet {
private JButton ok, annuler;
private JCheckBox b, f;
private JComboBox listeCouleurs;
private JPanel p, p1;
public void init()
{
// Applet.
getContentPane().setLayout( new BorderLayout() );
// Nord.
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
19
listeCouleurs = new JComboBox();
20
listeCouleurs.addItem( "ROUGE" );
21
getContentPane().add( listeCouleurs, BorderLayout.NORTH );
22
23
// Centre.
24
p = new JPanel();
25
b = new JCheckBox( "arrière-plan" );
26
f = new JCheckBox( "avant-plan" );
27
p.add( b );
28
p.add( f );
29
getContentPane().add( p, BorderLayout.CENTER );
30
31
// Sud.
32
ok = new JButton( "Ok" );
33
annuler = new JButton( "Annuler" );
34
p1 = new JPanel();
35
p1.add( ok );
36
p1.add( annuler );
37
getContentPane().add( p1, BorderLayout.SOUTH );
38
}
39 }
12.11 Créez l’interface utilisateur graphique suivante. Aucune fonctionnalité n’est nécessaire.
RÉP.:
Note: cet exercice vous est proposé soit comme application (comme dans l’énoncé de l’exercice du livre), soit comme
applet, comme ici. Le cédérom d’accompagnement propose les deux versions. La version application est dans le fichier AppImprimante.java.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Solution de l’exercice 12.11.
// Imprimante.java
// Ce programme crée un GUI simple.
// html: largeur = 400, hauteur = 130.
import javax.swing.*;
import java.awt.*;
public class Imprimante extends JApplet {
private JButton b1, b2, b3, b4;
private JCheckBox c1, c2, c3, c4;
private JRadioButton br1, br2, br3;
private ButtonGroup groupeBRadio;
private JComboBox q;
private JLabel etiquette1, etiquette2;
private JPanel p1, p2, p3, p4, p5, p6, p7, p8;
public void init()
{
// Construire le volet nord gauche.
etiquette1 = new JLabel( "Imprimante: Epson EPL-7000" );
p1 = new JPanel();
p1.setLayout( new FlowLayout( FlowLayout.LEFT ) );
p1.add( etiquette1 );
//
b1
b2
b3
b4
Construire le volet est droit.
= new JButton( "Ok" );
= new JButton( "Annuler" );
= new JButton( "Paramètres..." );
= new JButton( "Aide" );
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
p2 = new JPanel();
p2.setLayout( new GridLayout( 4, 1, 5, 5 ) );
p2.add( b1 );
p2.add( b2 );
p2.add( b3 );
p2.add( b4 );
// Construire le volet sud gauche.
etiquette2 = new JLabel( "Qualité d’impression: " );
q = new JComboBox();
q.addItem( "Haute" );
c1 = new JCheckBox( "Imprimer dans un fichier" );
p3 = new JPanel();
p3.setLayout( new FlowLayout( FlowLayout.CENTER, 10, 0 ) );
p3.add( etiquette2 );
p3.add( q );
p3.add( c1 );
// Construire le // Construire le volet est gauche.
c2 = new JCheckBox( "Image" );
c3 = new JCheckBox( "Texte" );
c4 = new JCheckBox( "Code" );
p4 = new JPanel();
p4.setLayout( new BorderLayout( ) );
p4.add( c2, BorderLayout.NORTH );
p4.add( c3, BorderLayout.CENTER );
p4.add( c4, BorderLayout.SOUTH );
// Construire le volet ouest gauche.
p5 = new JPanel();
p5.setLayout( new BorderLayout() );
p5.add( br1 = new JRadioButton( "Sélection", false ),
BorderLayout.NORTH );
p5.add( br2 = new JRadioButton( "Tous", true ),
BorderLayout.CENTER );
p5.add( br3 = new JRadioButton( "Applet", false ),
BorderLayout.SOUTH );
// Grouper les boutons radio.
groupeBRadio=new ButtonGroup();
groupeBRadio.add( br1 );
groupeBRadio.add( br2 );
groupeBRadio.add( br3 );
// Construire centre gauche.
p8 = new JPanel();
p8.setLayout( new FlowLayout( FlowLayout.CENTER, 30, 0 ) );
p8.setBackground( Color.white );
p8.add( p4 );
p8.add( p5 );
// Définir volet gauche.
p6 = new JPanel();
p6.setLayout( new BorderLayout() );
p6.add( p1, BorderLayout.NORTH );
p6.add( p8, BorderLayout.CENTER );
p6.add( p3, BorderLayout.SOUTH );
// Définir le tracé de l’applet.
p7 = new JPanel();
p7.setLayout( new FlowLayout( FlowLayout.CENTER, 10, 0 ) );
p7.add( p6 );
p7.add( p2 );
getContentPane().add( p7 );
}
}
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
12.12 Écrivez un programme de conversion de températures de degrés Fahrenheit en degrés Celsius. La température en Fahrenheit est entrée au clavier (par l’entremise d’un JTextField). Un JLabel permet l’affichage de la tempréature convertie. La formule suivante permet de calculer la conversion:
Celsius = 5 / 9 × (Fahrenheit – 32)
RÉP.:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// Solution de l’exercice 12.12.
// Conversion.java
// Programme de conversion de températures.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Conversion extends JFrame {
private JPanel p;
private JLabel etiquette1, etiquette2;
private JTextField temperatureF;
private JTextField temperatureC;
public Conversion()
{
etiquette1 = new JLabel( "Entrer la température en degrés Fahrenheit:" );
etiquette2 = new JLabel( "La température en degrés Celcius est de:" );
temperatureF = new JTextField( 10 );
temperatureF.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e)
{
int celcius, temp;
temp = Integer.parseInt( temperatureF.getText() );
celcius = ( int ) ( 5.0f / 9.0f * ( temp - 32 ) );
temperatureC.setText( String.valueOf( celcius ) );
}
}
);
temperatureC = new JTextField( 10 );
temperatureC.setEditable( false );
p = new JPanel();
p.setLayout( new BorderLayout() );
p.add( temperatureF, BorderLayout.NORTH );
p.add( etiquette2, BorderLayout.SOUTH );
Container c = getContentPane();
c.setLayout( new BorderLayout() );
c.add( etiquette1, BorderLayout.NORTH );
c.add( p, BorderLayout.CENTER );
c.add( temperatureC, BorderLayout.SOUTH );
setSize( 270, 150 );
show();
}
public static void main ( String args[] )
{
Conversion app = new Conversion();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
59
60
61
62
}
);
}
}
12.13 Améliorez le programme de conversion de températures de l’exercice 12.12 en lui ajoutant l’échelle de température en Kelvin. Le programme doit permettre aussi à l’utilisateur de convertir des températures entre deux échelles disponibles quelconques.
La formule suivante calcule la conversion de températures de degrés Celsius en Kelvin, outre la formule de l’exercice 12.12:
Kelvin = Celsius + 273
RÉP.:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// Solution de l’exercice 12.13.
// Conversion.java
// Programme de conversion de températures.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Conversion extends JFrame {
private JPanel conversionDe, conversionVers;
private JPanel affichage;
private JLabel etiquette1, etiquette2, etiquette3;
private JLabel etiquette4, label5;
private JTextField temperatureF;
private JTextField temperatureC;
private JTextField temperatureK;
private ButtonGroup radioDe;
private ButtonGroup radioVers;
private JRadioButton caseVersCelsius;
private JRadioButton caseVersFahrenheit;
private JRadioButton caseVersKelvin;
private JRadioButton caseDeCelsius;
private JRadioButton caseDeFahrenheit;
private JRadioButton caseDeKelvin;
public Conversion()
{
caseDeFahrenheit = new JRadioButton( "Fahrenheit", true );
caseDeCelsius = new JRadioButton( "Celcius", false );
caseDeKelvin = new JRadioButton( "Kelvin",
false );
radioDe = new ButtonGroup();
radioDe.add( caseDeFahrenheit );
radioDe.add( caseDeCelsius );
radioDe.add( caseDeKelvin );
GestBoutonRadio gestionnaireBR = new GestBoutonRadio();
caseDeFahrenheit.addItemListener( gestionnaireBR );
caseDeCelsius.addItemListener( gestionnaireBR );
caseDeKelvin.addItemListener( gestionnaireBR );
caseVersFahrenheit = new JRadioButton( "Fahrenheit", false );
caseVersCelsius = new JRadioButton( "Celcius", true );
caseVersKelvin = new JRadioButton( "Kelvin", false );
radioVers = new ButtonGroup();
radioVers.add( caseVersFahrenheit );
radioVers.add( caseVersCelsius );
radioVers.add( caseVersKelvin );
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
conversionDe = new JPanel();
conversionVers = new JPanel();
affichage = new JPanel();
affichage.setLayout( new GridLayout( 6, 1, 5, 5 ) );
conversionDe.setLayout( new GridLayout( 4, 1 ) );
conversionVers.setLayout( new GridLayout( 4, 1 ) );
etiquette1 =
etiquette2 =
etiquette3 =
etiquette4 =
label5 = new
new JLabel( "Fahrenheit:" );
new JLabel( "Celcius:" );
new JLabel( "Kelvin:" );
new JLabel( "Conversion de:" );
JLabel( "Conversion en:" );
temperatureF = new JTextField( 10 );
temperatureC = new JTextField( 10 );
temperatureK = new JTextField( 10 );
ActionHandler gestionnaireAct = new ActionHandler();
temperatureF.addActionListener( gestionnaireAct );
temperatureC.addActionListener( gestionnaireAct );
temperatureK.addActionListener( gestionnaireAct );
temperatureC.setEditable( false );
temperatureK.setEditable( false );
conversionDe.add( etiquette4 );
conversionDe.add( caseDeFahrenheit );
conversionDe.add( caseDeCelsius );
conversionDe.add( caseDeKelvin );
affichage.add(
affichage.add(
affichage.add(
affichage.add(
affichage.add(
affichage.add(
etiquette1 );
temperatureF );
etiquette2 );
temperatureC );
etiquette3 );
temperatureK );
conversionVers.add( label5 );
conversionVers.add( caseVersFahrenheit );
conversionVers.add( caseVersCelsius );
conversionVers.add( caseVersKelvin );
Container c = getContentPane();
c.setLayout( new GridLayout( 1, 3 ) );
c.add( conversionDe );
c.add( affichage );
c.add( conversionVers );
setSize( 300, 200 );
show();
}
private void effacerChampsTexte()
{
temperatureC.setText( "" );
temperatureK.setText( "" );
temperatureF.setText( "" );
}
public static void main ( String args[] )
{
Conversion app = new Conversion();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
}
);
}
private class ActionHandler implements ActionListener{
public void actionPerformed( ActionEvent e )
{
int convertTemp, temp;
temp = Integer.parseInt( ( ( JTextField ) e.getSource() ).getText() );
if ( caseDeFahrenheit.isSelected() && caseVersCelsius.isSelected() ) {
convertTemp = ( int ) ( 5.0f / 9.0f * ( temp - 32 ) );
temperatureC.setText( String.valueOf( convertTemp ) );
}
else if ( caseDeFahrenheit.isSelected() && caseVersKelvin.isSelected() ) {
convertTemp = ( int ) ( 5.0f / 9.0f * ( temp - 32 ) + 273 );
temperatureK.setText( String.valueOf( convertTemp ) );
}
else if ( caseDeCelsius.isSelected() && caseVersFahrenheit.isSelected() ) {
convertTemp = ( int ) ( 9.0f / 5.0f * temp + 32 );
temperatureF.setText( String.valueOf( convertTemp ) );
}
else if ( caseDeCelsius.isSelected() && caseVersKelvin.isSelected() ) {
convertTemp = temp + 273;
temperatureK.setText( String.valueOf( convertTemp ) );
}
else if ( caseDeKelvin.isSelected() && caseVersCelsius.isSelected() ) {
convertTemp = temp - 273;
temperatureC.setText( String.valueOf( convertTemp ) );
}
else if ( caseDeKelvin.isSelected() && caseVersFahrenheit.isSelected() ) {
convertTemp = ( int ) ( 5.0f / 9.0f * ( temp - 273 ) + 32 );
temperatureF.setText( String.valueOf( convertTemp ) );
}
}
}
private class GestBoutonRadio implements ItemListener {
public void itemStateChanged( ItemEvent e )
{
if ( e.getSource() == caseDeFahrenheit ) {
temperatureC.setEditable( false );
temperatureK.setEditable( false );
temperatureF.setEditable( true );
}
else if ( e.getSource() == caseDeCelsius ) {
temperatureC.setEditable( true );
temperatureK.setEditable( false );
temperatureF.setEditable( false );
}
else if ( e.getSource() == caseDeKelvin ) {
temperatureC.setEditable( false );
temperatureK.setEditable( true );
temperatureF.setEditable( false );
}
effacerChampsTexte();
}
}
}
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
12.14 Écrivez une application qui permette à l’utilisateur de tracer un rectangle en tirant sur la souris dans la fenêtre d’application.
La coordonnée supérieure gauche est l’emplacement où l’utilisateur presse le bouton de la souris, et la coordonnée inférieure droite
est celle de l’emplacement où l’utilisateur relâche le bouton de la souris. Affichez aussi l’aire du rectangle dans un JLabel installé
dans la région SOUTH d’un BorderLayout. La formule suivante permet de calculer l’aire du rectangle:
aire = largeur × hauteur
RÉP.:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// Solution de l’exercice 12.14.
// Dessin.java
// Ce programme dessine un rectangle à l’aide de la souris.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Dessin extends JFrame {
private int hautX, hautY;
private int largeur, hauteur;
private int basX, basY;
protected JLabel etat;
public Dessin()
{
super( "Dessin" );
hautX = hautY = 0;
addMouseListener( new MouseHandler( this ) );
etat = new JLabel();
getContentPane().add( etat, BorderLayout.SOUTH );
setSize( 300, 150 );
show();
}
public
public
public
public
public
public
public
public
public
public
public
public
int getHautX() { return hautX; }
int getHautY() { return hautY; }
int getLargeur() { return largeur; }
int getHauteur() { return hauteur; }
int getBasX() { return basX; }
int getBasY() { return basY; }
void setHautX( int x ) { hautX = x; }
void setHautY( int y ) { hautY = y; }
void setBasX( int x ) { basX = x; }
void setBasY( int y ) { basY = y; }
void setLargeur( int w ) { largeur = w; }
void setHauteur( int h ) { hauteur = h; }
public void paint( Graphics g )
{
super.paint( g );
g.drawRect( hautX, hautY, largeur, hauteur );
}
public static void main( String args[] )
{
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Dessin app = new Dessin();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
}
class MouseHandler extends MouseAdapter {
private Dessin dessin;
public MouseHandler( Dessin d ) { dessin = d; }
public void mouseReleased( MouseEvent e )
{
dessin.setBasX( e.getX() );
dessin.setBasY( e.getY() );
dessin.setLargeur( Math.abs( dessin.getHautX() - dessin.getBasX() ) );
dessin.setHauteur( Math.abs( dessin.getHautY() - dessin.getBasY() ) );
dessin.setHautX( Math.min( dessin.getHautX(), dessin.getBasX() ) );
dessin.setHautY( Math.min( dessin.getHautY(), dessin.getBasY() ) );
dessin.etat.setText( "L’aire est de " +
( dessin.getLargeur() * dessin.getHauteur() ) );
dessin.repaint();
}
public void mousePressed( MouseEvent e )
{
dessin.setHautX( e.getX() );
dessin.setHautY( e.getY() );
}
}
12.15 Modifiez le programme de l’exercice 12.14 pour tracer des formes différentes. L’utilisateur doit pouvoir choisir entre un
ovale, un arc, une ligne, un rectangle aux angles arrondis et un polygone prédéfini. Affichez également les coordonnées du curseur
de la souris dans la barre d’état.
RÉP.:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Solution de l’exercice 12.15.
// DessinFormes.java
// Ce programme dessine un rectangle à l’aide de la souris.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class DessinFormes extends JFrame {
private int hautX, hautY;
private int largeur, hauteur, forme;
private int basX, basY;
private JLabel etat;
private final int LIGNE = 1, OVALE = 2, ARC = 3, ROUND = 4, POLY = 5;
private String nomsFormes[] = { "Ovale", "Arc", "Ligne",
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
"Rect. arrondi", "Polygone" };
public DessinFormes()
{
super( "Dessin de formes" );
hautX = hautY = 0;
etat = new JLabel();
addMouseListener( new MouseHandler() );
addMouseMotionListener( new MouseMotionHandler() );
addKeyListener( new KeyHandler() );
Container c = getContentPane();
c.add( etat, BorderLayout.SOUTH );
setSize( 300, 300 );
show();
JOptionPane.showMessageDialog( null,
"Appuyer sur une touche pour choisir la forme à dessiner\n" +
"1 - ligne\n2 - ovale\n3 - arc\n4 - rectangle\n5 - polygone\n" );
}
public
public
public
public
public
public
public
public
public
public
public
public
public
int getHautX() { return hautX; }
int getHautY() { return hautY; }
int getLargeur() { return largeur; }
int getHauteur() { return hauteur; }
int getBasX() { return basX; }
int getBasY() { return basY; }
void setHautX( int x ) { hautX = x; }
void setHautY( int y ) { hautY = y; }
void setBasX( int x ) { basX = x; }
void setBasY( int y ) { basY = y; }
void setLargeur( int w ) { largeur = w; }
void setHauteur( int h ) { hauteur = h; }
void setEtat( String s ){ etat.setText( s ); }
public void paint( Graphics g )
{
super.paint( g );
if ( forme != LIGNE ) {
hautX = Math.min( hautX, basX );
hautY = Math.min( hautY, basY );
}
switch ( forme ) {
case LIGNE:
g.drawLine( hautX, hautY, basX, basY );
break;
case OVALE:
g.drawOval( hautX, hautY, largeur, hauteur );
break;
case ARC:
g.drawArc( hautX, hautY, largeur, hauteur, 0, 90 );
break;
case ROUND:
g.drawRoundRect( hautX, hautY, largeur, hauteur, 20, 10 );
break;
case POLY:
int xValues[] = { hautX + 10, hautX, basX, hautX - 20, hautX - 10, hautX };
int yValues[] = { hautY, hautY + 10, basY, hautY + 20, hautY + 10, hautY };
g.drawPolygon( xValues, yValues, 6 );
break;
}
}
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
public static void main( String args[] )
{
DessinFormes app = new DessinFormes();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
// Classes internes de gestion des événements.
private class MouseMotionHandler extends MouseMotionAdapter {
public void mouseMoved( MouseEvent e )
{
setEtat( "( " + e.getX() + ", " + e.getY() + " )" );
}
}
private class MouseHandler extends MouseAdapter {
public void mouseReleased( MouseEvent e )
{
setBasX( e.getX() );
setBasY( e.getY() );
setLargeur( Math.abs( getHautX() - getBasX() ) );
setHauteur( Math.abs( getHautY() - getBasY() ) );
setHautX( Math.min( getHautX(), getBasX() ) );
setHautY( Math.min( getHautY(), getBasY() ) );
repaint();
}
public void mousePressed( MouseEvent e )
{
setHautX( e.getX() );
setHautY( e.getY() );
}
}
private class KeyHandler extends KeyAdapter {
public void keyPressed( KeyEvent e )
{
forme = Integer.parseInt( e.getKeyChar() + "" );
}
}
}
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
12.16 Écrivez un programme qui permette à l’utilisateur de dessiner une forme à l’aide de la souris. La forme à tracer est prédéterminée par un événement KeyEvent à l’aide des touches suivantes: c dessine un cercle, o dessine un ovale, r trace un rectangle
et l trace une ligne. La taille et l’emplacement de la forme sont déterminés par les événements mousePressed et mouseReleased. Affichez le nom de la forme en cours de tracé dans un JLabel de la région SOUTH d’un BorderLayout. La forme
initialement sélectionnée est un cercle.
RÉP.:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// Solution de l’exercice 12.16.
// DessinIII.java
// Ce programme dessine des formes diverses à l’aide de la souris.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class DessinIII extends JFrame {
private int hautX, hautY;
private int largeur, hauteur, forme;
private int basX, basY;
protected JLabel etat;
public static final int CERCLE = 0, OVALE = 1, LIGNE = 2, RECT = 3;
public DessinIII()
{
super( "DessinIII" );
hautX = hautY = 0;
etat = new JLabel();
getContentPane().add( etat, BorderLayout.SOUTH );
addMouseListener( new MouseHandler() );
addKeyListener( new KeyHandler() );
setSize( 300, 150 );
show();
}
public
public
public
public
public
public
public
public
public
public
int getHautX() { return hautX; }
int getHautY() { return hautY; }
int getBasX() { return basX; }
int getBasY() { return basY; }
void setHautX( int x ) { hautX = x; }
void setHautY( int y ) { hautY = y; }
void setBasX( int x ) { basX = x; }
void setBasY( int y ) { basY = y; }
void setLargeur( int w ) { largeur = w; }
void setHauteur( int h ) { hauteur = h; }
public void paint( Graphics g )
{
super.paint( g );
if ( forme != LIGNE ) {
hautX = Math.min( hautX, basX );
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
hautY = Math.min( hautY, basY );
}
switch ( forme ) {
case CERCLE:
g.drawOval( hautX,
break;
case OVALE:
g.drawOval( hautX,
break;
case LIGNE:
g.drawLine( hautX,
break;
case RECT:
g.drawRect( hautX,
break;
}
hautY, largeur, largeur );
hautY, largeur, hauteur );
hautY, basX, basY );
hautY, largeur, hauteur );
}
public void setForme( int s ) { forme = s; }
public static void main( String args[] )
{
DessinIII app = new DessinIII();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
private class MouseHandler extends MouseAdapter {
public void mouseReleased( MouseEvent e )
{
setBasX( e.getX() );
setBasY( e.getY() );
setLargeur( Math.abs( getHautX() - getBasX() ) );
setHauteur( Math.abs( getHautY() - getBasY() ) );
repaint();
}
public void mousePressed( MouseEvent e )
{
setHautX( e.getX() );
setHautY( e.getY() );
}
}
private class KeyHandler extends KeyAdapter {
public void keyTyped( KeyEvent e )
{
int s = DessinIII.CERCLE;
switch ( e.getKeyChar() ) {
case 'c': case 'C':
s = DessinIII.CERCLE;
etat.setText( "Cercle" );
break;
case 'o': case 'O':
s = DessinIII.OVALE;
etat.setText( "Ovale" );
break;
case 'r': case 'R':
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
s = DessinIII.RECT;
etat.setText( "Rectangle" );
break;
case 'l': case 'L':
s = DessinIII.LIGNE;
etat.setText( "Ligne" );
break;
default:
etat.setText( "Cercle" );
break;
}
setForme( s );
}
}
}
12.17 Créez une application qui permette à l’utilisateur de peindre une image. L’utilisateur doit pouvoir choisir la forme à dessiner, la couleur d’affichage de la forme et s’il faut remplir la forme de la couleur choisie. Utilisez les composants d’interface utilisateur graphique que nous avons évoqués dans ce chapitre, tels que les JComboBox, JRadioButton et JCheckBox, pour
permettre à l’utilisateur de sélectionner différentes options. Le programme fournit aussi un objet JButton qui sert à effacer le
contenu de la fenêtre.
RÉP.:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Solution de l’exercice 12.17.
// Peintre.java
// Programme de dessin.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Peintre extends JFrame {
private int hautX, hautY;
private int hauteur, largeur;
private int basY, basX;
private int forme;
private boolean efface;
private Color couleurTrace;
private boolean rempli;
private
private
private
private
private
private
private
JPanel p1, p2, p3;
JPanel p4, p5;
JRadioButton boiteOvale, boiteRectangle, boiteLigne;
ButtonGroup groupeFormes;
JCheckBox boitePleine;
JList listeCouleurs;
JButton boutonEffacer;
private String nomsCouleurs[] = {"Noir", "Vert", "Bleu", "Rouge", "Cyan" };
private Color couleurs[] = { Color.black, Color.green, Color.blue, Color.red,
Color.cyan };
private final int OVALE = 1;
private final int LIGNE = 2;
private final int RECT = 3;
private fenetreBoiteAOutils outils;
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
public Peintre()
{
super( "Peintre" );
// Pré-définir à un ovale noir.
setForme( OVALE );
setCouleurDessin( Color.black );
addMouseListener( new MouseHandler() );
setSize( 300, 300 );
show();
outils = new fenetreBoiteAOutils();
}
public void update( Graphics g )
{
paint( g );
}
public
public
public
public
public
public
public
public
public
int getHautX() { return hautX; }
int getHautY() { return hautY; }
int getLargeur() { return largeur; }
int getHauteur() { return hauteur; }
int getBasX() { return basX; }
int getBasY() { return basY; }
int getForme() { return forme; }
Color getCouleurDessin() { return couleurTrace; }
boolean getRemplissage() { return rempli; }
public
public
public
public
public
public
void
void
void
void
void
void
setHautX( int x ) { hautX = x; }
setHautY( int y ) { hautY = y; }
setBasX( int x ) { basX = x; }
setBasY( int y ) { basY = y; }
setLargeur( int w ) { largeur = w; }
setHauteur( int h ) { hauteur = h; }
public void setForme( int s )
{
if ( s >=OVALE && s <= RECT )
forme = s;
}
public void setCouleurDessin( Color c )
{
for ( int i = 0; i < couleurs.length; i++ )
if ( c == couleurs[ i ] ) {
couleurTrace = c;
return;
}
}
public void setEffacement(){ efface = true; }
public void setRemplissage() { rempli = true; }
public void effacerRemplissage() { rempli = false; }
public void paint( Graphics g )
{
g.setColor( couleurTrace );
largeur = Math.abs( hautX - basX );
hauteur = Math.abs( hautY - basY );
if ( forme != LIGNE ) {
hautX = Math.min( hautX, basX );
hautY = Math.min( hautY, basY );
}
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
if ( rempli && forme != LIGNE )
switch ( forme ) {
case OVALE:
g.fillOval( hautX, hautY, largeur, hauteur );
break;
case RECT:
g.fillRect( hautX, hautY, largeur, hauteur );
break;
}
else
switch ( forme ) {
case OVALE:
g.drawOval( hautX, hautY, largeur, hauteur );
break;
case RECT:
g.drawRect( hautX, hautY, largeur, hauteur );
break;
}
if ( efface == true ) {
g.setColor( Color.white );
g.fillRect( 0, 0, getSize().width, getSize().height );
efface = false;
}
else if ( forme == LIGNE )
g.drawLine( hautX, hautY, basX, basY );
}
// Fenêtre des composants GUI.
private class fenetreBoiteAOutils extends JFrame {
public fenetreBoiteAOutils()
{
// Mise en place du bouton d’effacement.
boutonEffacer = new JButton( "Effacer" );
boutonEffacer.addActionListener( new GestBoutonEffacement() );
// Définir les outils de choix.
boiteOvale = new JRadioButton( "Ovale", true );
boiteLigne = new JRadioButton( "Ligne", false );
boiteRectangle = new JRadioButton( "Rectangle", false );
GestBoutonRadio gestionnaire = new GestBoutonRadio();
boiteOvale.addItemListener( gestionnaire );
boiteLigne.addItemListener( gestionnaire );
boiteRectangle.addItemListener( gestionnaire );
groupeFormes = new ButtonGroup();
// Grouper les formes.
groupeFormes.add( boiteOvale );
groupeFormes.add( boiteLigne );
groupeFormes.add( boiteRectangle );
// Définir les options de remplissage.
boitePleine = new JCheckBox( "rempli" );
GestBoitePleine gestRemplissage = new GestBoitePleine();
boitePleine.addItemListener( gestRemplissage );
// Définir les options de couleurs.
listeCouleurs = new JList( nomsCouleurs );
listeCouleurs.setVisibleRowCount( 5 );
listeCouleurs.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
// Définir gestionnaire d’événement.
listeCouleurs.addListSelectionListener(
new ListSelectionListener() {
public void valueChanged( ListSelectionEvent e )
{
couleurTrace = couleurs[ listeCouleurs.getSelectedIndex() ];
}
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
}
);
//
p1
p2
p3
p4
p5
Créer
= new
= new
= new
= new
= new
volets et tracés.
JPanel();
JPanel();
JPanel();
JPanel();
JPanel();
p1.setLayout(
p2.setLayout(
p3.setLayout(
p4.setLayout(
p5.setLayout(
new
new
new
new
new
GridLayout(
GridLayout(
FlowLayout(
FlowLayout(
GridLayout(
2, 1 ) );
2, 1 ) );
FlowLayout.LEFT ) );
FlowLayout.LEFT ) );
4, 1 ) );
p1.add(
p1.add(
p2.add(
p2.add(
p3.add(
p4.add(
boiteOvale );
boiteLigne );
boiteRectangle );
boitePleine );
boutonEffacer );
new JScrollPane( listeCouleurs ) );
p5.add(
p5.add(
p5.add(
p5.add(
p1
p2
p3
p4
);
);
);
);
Container c = getContentPane();
c.setLayout( new FlowLayout( FlowLayout.LEFT ) );
c.add( p5 );
setSize( 300, 300 );
setLocation( 300, 0 );
show();
}
}
private class MouseHandler extends MouseAdapter {
public void mousePressed( MouseEvent e )
{
setHautX( e.getX() );
setHautY( e.getY() );
}
public void mouseReleased( MouseEvent e )
{
setBasX( e.getX() );
setBasY( e.getY() );
repaint();
}
}
private class GestBoutonEffacement implements ActionListener {
public void actionPerformed( ActionEvent e )
{
setEffacement();
repaint();
}
}
private class GestBoutonRadio implements ItemListener {
public void itemStateChanged( ItemEvent e )
{
if ( e.getSource() == boiteOvale )
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
setForme( OVALE );
else if ( e.getSource() == boiteLigne )
setForme( LIGNE );
else if ( e.getSource() == boiteRectangle )
setForme( RECT );
}
}
private class GestBoitePleine implements ItemListener {
public void itemStateChanged( ItemEvent e )
{
if ( e.getSource() == boitePleine )
if ( e.getStateChange() == ItemEvent.SELECTED )
setRemplissage();
else
effacerRemplissage();
}
}
public static void main( String args[] )
{
Peintre app = new Peintre();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
}
12.18 Écrivez un programme qui exploite des instructions System.out.println pour afficher les événements à mesure
qu’ils apparaissent. Proposez un JComboBox équipé d’au moins quatre éléments. L’utilisateur doit pouvoir choisir dans ce JComboBox l’événement à surveiller. Lorsqu’un événement d’un type donné apparaît, affichez des informations concernant cet événement dans un boîte de dialogue de message. La méthode toString de l’objet d’événement convertit cet objet en une
représentation sous forme de chaîne de caractères.
12.19 Écrivez un programme qui trace un carré. À mesure que la souris se déplace au-dessus de la zone de dessin, redessinez
(méthode repaint) de sorte que le coin supérieur gauche du carré suive exactement le chemin suivi par le curseur de la souris.
RÉP.:
1
2
3
4
// Solution de l’exercice 12.19.
// Suivre.java
// Ce programme dessine un rectangle qui suit le curseur de la souris.
import java.awt.*;
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Suivre extends JFrame {
private int sourisX, sourisY;
private Thread t;
public Suivre()
{
addMouseMotionListener(
new MouseMotionAdapter() {
public void mouseMoved( MouseEvent e )
{
sourisX = e.getX();
sourisY = e.getY();
repaint();
}
}
);
setSize( 300, 300 );
show();
}
public void paint( Graphics g )
{
super.paint( g );
g.drawRect( sourisX, sourisY, 30, 30 );
}
public static void main( String args[] )
{
Suivre app = new Suivre();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
}
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
12.20 Modifiez le programme de la figure 12.19 pour y incorporer des couleurs. Proposez à cet effet une sorte de barre d’outils
au pied de la fenêtre, constituée d’objets JRadioButton, qui reprend les six couleurs suivantes: rouge, noir, magenta, bleu, vert
et jaune. La barre d’outils consiste en six boutons, qui portent chacun le nom de couleur adéquat. Lorsqu’une couleur est sélectionnée, le dessin doit suivre en cette nouvelle couleur.
RÉP.:
Note: du fait d’un problème de dessin sur une fenêtre qui contient des composants GUI dans son volet de contenu,
nous plaçons l’interface utilisateur graphique sur une fenêtre distincte.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// Solution de l’exercice 12.20.
// Tirer.java
// Ce programme fournit une barre d’outils.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Tirer extends JFrame {
private int valeurX = -10, valeurY = -10;
private Color couleur;
private String nomsCouleurs[] = { "Rouge", "Noir",
"Magenta", "Bleu", "Vert",
"Jaune" };
private Color couleurs[] =
{ Color.red, Color.black, Color.magenta, Color.blue,
Color.green, Color.yellow };
private fenetreBoiteAOutils outils;
public Tirer()
{
super( "Déplacer la souris pour dessiner." );
couleur = Color.black;
addMouseMotionListener( new MotionHandler( ) );
setSize( 350, 150 );
show();
outils = new fenetreBoiteAOutils();
}
public void paint( Graphics g )
{
g.setColor( couleur );
g.drawRect( valeurX, valeurY, 4, 4 );
}
public void update( Graphics g ) { paint( g ); }
// Empêcher l’effacement.
public void setColor( Color c ) { couleur = c; }
public void setCoordinates( int x, int y )
{
valeurX = x;
valeurY = y;
repaint();
}
public static void main( String args[] )
{
Tirer app = new Tirer();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
{
System.exit( 0 );
}
}
);
}
private class fenetreBoiteAOutils extends JFrame {
private JRadioButton buttons[];
private JPanel p;
private ButtonGroup radio;
public fenetreBoiteAOutils()
{
super( "Cliquer sur un bouton pour sélectionner la couleur." );
buttons = new JRadioButton[ 6 ];
p = new JPanel();
p.setLayout( new GridLayout( 1, 6, 0, 0 ) );
ButtonHandler bHandle = new ButtonHandler();
radio = new ButtonGroup();
for ( int j = 0; j < buttons.length; j++ ) {
buttons[ j ] = new JRadioButton( nomsCouleurs[ j ] );
p.add( buttons[ j ] );
buttons[ j ].addActionListener( bHandle );
radio.add( buttons[ j ] );
}
Container c = getContentPane();
c.setLayout( new BorderLayout() );
c.add( p, BorderLayout.SOUTH );
pack();
setLocation( 350, 0 );
show();
}
}
private class MotionHandler implements MouseMotionListener {
public void mouseDragged( MouseEvent e )
{ setCoordinates( e.getX(), e.getY() ); }
public void mouseMoved( MouseEvent e )
{ setCoordinates( e.getX(), e.getY() ); }
}
private class ButtonHandler implements ActionListener {
public void actionPerformed( ActionEvent e )
{
if ( e.getActionCommand().equals( "Rouge" ) )
setColor( Color.red );
else if ( e.getActionCommand().equals( "Vert" ) )
setColor( Color.green );
else if ( e.getActionCommand().equals( "Magenta" ) )
setColor( Color.magenta );
else if ( e.getActionCommand().equals( "Bleu" ) )
setColor( Color.blue );
else if ( e.getActionCommand().equals( "Noir" ) )
setColor( Color.black );
else if ( e.getActionCommand().equals( "Jaune" ) )
setColor( Color.yellow );
}
}
}
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
12.21 Écrivez un programme qui permette de jouer au jeu des devinettes sur des nombres comme suit: le programme choisit un
nombre au hasard compris entre 1 et 1000, et l’utilisateur doit le deviner. Le programme affiche dans une étiquette de texte:
J’ai un nombre compris entre 1 et 1000. Pouvez-vous le deviner?
Veuillez entrer votre premier essai.
Un JTextField permet d’entrer les essais successifs. À chaque essai, la couleur d’arrière-plan bascule du bleu au rouge et viceversa. Le rouge indique que l’utilisateur approche de la bonne valeur, tandis que le bleu indique qu’il s’en éloigne. Un JLabel
affiche soit «Trop haut» ou «Trop bas» pour aider l’utilisateur à repérer la réponse correcte. Lorsque l’utilisateur trouve la
réponse correcte, affichez le texte «Correct!» et faites en sorte que le JTextField soit non modifiable. Un JButton permet
enfin à l’utilisateur de lancer une nouvelle partie. Lors d’un clic sur le JButton le programme génère un nouveau nombre aléatoire
et le JTextField d’entrée bascule en mode modifiable.
RÉP.:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Solution de l’exercice 12.21.
// DevineNombre.java
// Deviner un nombre.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class DevineNombre extends JFrame {
private int nombre, tentative;
private int plusGrand, plusPetit;
private JTextField entreeTentative;
private JTextField message;
private JLabel texte1, texte2;
private JButton nouveauJeu;
public DevineNombre()
{
super( "Cherche nombre" );
texte1 = new JLabel( "J’ai un nombre compris entre 1 et 1000." );
texte2 = new JLabel( "Pouvez-vous le deviner? " +
"Votre premier essai:" );
plusGrand = 0;
plusPetit = 1000;
entreeTentative = new JTextField( 5 );
entreeTentative.addActionListener( new GestionnaireEssai( ) );
message = new JTextField( "<------------------", 15 );
message.setEditable( false );
nouveauJeu = new JButton( "Nouvelle partie" );
nouveauJeu.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
message.setText( "<------------------" );
entreeTentative.setText( "" );
entreeTentative.setEditable( true );
leJeu();
}
}
);
Container c = getContentPane();
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
c.setLayout( new FlowLayout() );
c.add( texte1 );
c.add( texte2 );
c.add( entreeTentative );
c.add( message );
c.add( nouveauJeu );
setSize( 300, 200 );
show();
leJeu();
}
public void leJeu()
{ nombre = ( int ) ( Math.random() * 1000 + 1 );
}
public static void main( String args[] )
{
DevineNombre app = new DevineNombre();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
class GestionnaireEssai implements ActionListener
{
public void actionPerformed( ActionEvent e )
{
tentative = Integer.parseInt( entreeTentative.getText() );
if ( tentative > nombre ) {
message.setText( "Trop haut" );
if ( tentative < plusPetit ) {
plusPetit = tentative;
setBackground( Color.red );
}
else
setBackground( Color.blue );
// Plus chaud.
// Plus froid.
}
else if ( tentative < nombre ) {
message.setText( "Trop bas" );
if ( tentative > plusGrand ) {
plusGrand = tentative;
setBackground( Color.red );
}
else
setBackground( Color.blue );
// Plus chaud.
// Plus froid.
}
else {
message.setText( "Correct!" );
setBackground( Color.white );
entreeTentative.setEditable( false );
plusPetit = 1000;
plusGrand = 0;
}
repaint();
}
}
}
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
12.22 L’affichage des événements à mesure qu’ils se produisent au cours de l’exécution d’un programme se montre très utile pour
la bonne compréhension des moments où ils se produisent et de la manière dont ils sont générés. Écrivez un programme qui permette
à l’utilisateur de générer et de gérer chacun des événements évoqués dans ce chapitre. Le programme fournit les méthodes des interfaces ActionListener, ItemListener, ListSelectionListener, MouseListener, MouseMotionListener et KeyListener pour permettre l’affichage de messages lorsque les événements se produisent. Exploitez la méthode
toString pour convertir les objets d’événements reçus dans chaque gestionnaire d’événement en une String affichable. La
méthode toString crée en fait une String qui contient toutes les informations utilies sur l’objet d’événement.
12.23 Modifiez votre solution à l’exercice 12.17 pour permettre à l’utilisateur de sélectionner une police et une taille de police,
puis de taper du texte dans un JTextField. Lorsque l’utilisateur appuie sur Entrée, affichez le texte sur le fond de fenêtre dans
la police et la taille choisies. Modifiez enfin le programme pour permettre à l’utilisateur de spécifier l’emplacement exact où il souhaite afficher le texte.
RÉP.:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// Solution de l’exercice 12.23.
// Peintre2.java
// Programme de dessin.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Peintre2 extends JFrame {
private int hautX, hautY, largeur, taillePolice;
private int hauteur, basX;
private int basY, forme;
private boolean efface, texteActif, rempli;
private Color couleurTrace;
private String police;
private JTextField texte;
private JPanel p1, p2, p3;
private JRadioButton boiteOvale, boiteRectangle, boiteLigne;
private ButtonGroup groupeFormes;
private JCheckBox boitePleine;
private JList listeCouleurs, listePolices, listeTailles;
private JButton boutonEffacer;
private String nomsCouleurs[] = {"Noir", "Vert", "Bleu", "Rouge", "Cyan" };
private Color couleurs[] =
{ Color.black, Color.green, Color.blue, Color.red, Color.cyan };
private
private
private
private
private
private
String nomsPolices[] = { "Serif", "SansSerif", "Monospaced" };
String nomsTailles[] = {"9", "10", "22", "72" };
int tailles[] = {9, 10, 22, 72 };
final int OVALE = 1;
final int LIGNE = 2;
final int RECT = 3;
private fenetreBoiteAOutils outils;
public Peintre2()
{
addMouseListener( new MouseHandler( ) );
// Pré-définir les valeurs de dessin.
couleurTrace = Color.black;
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
forme = OVALE;
police = "Serif";
taillePolice = 9;
setSize( 300, 300 );
show();
outils = new fenetreBoiteAOutils();
}
public
public
public
public
public
public
public
public
public
public
void update( Graphics g ) { paint( g ); }
int getHautX() { return hautX; }
int getHautY() { return hautY; }
int getLargeur() { return largeur; }
int getHauteur() { return hauteur; }
int getBasX() { return basX; }
int getBasY() { return basY; }
int getForme () {return (forme);}
Color getCouleurDessin () { return couleurTrace; }
boolean getRemplissage() { return rempli; }
public
public
public
public
public
public
void
void
void
void
void
void
setHautX( int x ) { hautX = x; }
setHautY( int y ) { hautY = y; }
setBasX( int x ) { basX = x; }
setBasY( int y ) { basY = y; }
setLargeur( int w ) { largeur = w; }
setHauteur( int h ) { hauteur = h; }
public void setForme( int s )
{
if ( s >=OVALE && s <= RECT )
forme = s;
}
public void setCouleurDessin( Color c )
{
for ( int i = 0; i < couleurs.length; i++ )
if ( c == couleurs[ i ] ) {
couleurTrace = c;
return;
}
}
public void setEffacement(){ efface = true; }
public void setRemplissage() { rempli = true; }
public void effacerRemplissage() { rempli = false; }
public void paint( Graphics g )
{
g.setColor( couleurTrace );
if ( texteActif ) {
g.setFont( new Font( police, Font.PLAIN, taillePolice ) );
g.drawString( texte.getText(), hautX, hautY );
texteActif = false;
return;
}
largeur = Math.abs( hautX - basX );
hauteur = Math.abs( hautY - basY );
if ( forme != LIGNE ) {
hautX = Math.min( hautX, basX );
hautY = Math.min( hautY, basY );
}
if ( rempli && forme != LIGNE )
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
switch ( forme ) {
case OVALE:
g.fillOval( hautX,
break;
case RECT:
g.fillRect( hautX,
break;
}
else
switch ( forme ) {
case OVALE:
g.drawOval( hautX,
break;
case RECT:
g.drawRect( hautX,
break;
}
hautY,
largeur, hauteur );
hautY, largeur, hauteur );
hautY,
largeur, hauteur );
hautY, largeur, hauteur );
if ( efface == true ) {
g.setColor( Color.white );
g.fillRect( 0, 0, getSize().width, getSize().height );
efface = false;
}
else if ( forme == LIGNE )
g.drawLine( hautX, hautY, basX, basY );
}
// Classe interne pour la fenêtre qui contient le GUI.
private class fenetreBoiteAOutils extends JFrame {
public fenetreBoiteAOutils()
{
texte = new JTextField( "Texte" );
texte.addActionListener(
new ActionListener () {
public void actionPerformed( ActionEvent e )
{
texteActif = true;
repaint();
}
}
);
listePolices = new JList( nomsPolices );
listePolices.setVisibleRowCount( 1 );
listePolices.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
listePolices.addListSelectionListener(
new ListSelectionListener() {
public void valueChanged( ListSelectionEvent e )
{
police = nomsPolices[ listePolices.getSelectedIndex() ];
}
}
);
listeTailles = new JList( nomsTailles );
listeTailles.setVisibleRowCount( 1 );
listeTailles.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
listeTailles.addListSelectionListener(
new ListSelectionListener() {
public void valueChanged( ListSelectionEvent e )
{
taillePolice = tailles[ listeTailles.getSelectedIndex() ];
}
}
);
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
boutonEffacer = new JButton( "Effacer" );
boutonEffacer.addActionListener( new GestBoutonEffacement() );
// Définir les options de remplissage.
boitePleine = new JCheckBox( "Plein" );
GestBoitePleine gestRemplissage = new GestBoitePleine();
boitePleine.addItemListener( gestRemplissage );
// Définir les options de couleurs.
listeCouleurs = new JList( nomsCouleurs );
listeCouleurs.setVisibleRowCount( 1 );
listeCouleurs.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
// Définir gestionnaire d’événement.
listeCouleurs.addListSelectionListener(
new ListSelectionListener() {
public void valueChanged( ListSelectionEvent e )
{
couleurTrace = couleurs[ listeCouleurs.getSelectedIndex() ];
}
}
);
// Définir les outils de choix.
boiteOvale = new JRadioButton( "Ovale", true );
boiteLigne = new JRadioButton( "Ligne", false );
boiteRectangle = new JRadioButton( "Rectangle", false );
GestBoutonRadio gestionnaire = new GestBoutonRadio();
boiteOvale.addItemListener( gestionnaire );
boiteLigne.addItemListener( gestionnaire );
boiteRectangle.addItemListener( gestionnaire );
groupeFormes = new ButtonGroup();
// Grouper les formes.
groupeFormes.add(boiteOvale);
groupeFormes.add(boiteLigne);
groupeFormes.add(boiteRectangle);
p1 = new JPanel();
p2 = new JPanel();
p3 = new JPanel();
p1.setLayout( new GridLayout( 1, 3 ) );
p2.setLayout( new GridLayout( 1, 2 ) );
p3.setLayout( new GridLayout( 1, 3 ) );
p1.add(
p1.add(
p1.add(
p2.add(
p2.add(
p3.add(
p3.add(
p3.add(
boiteOvale );
boiteLigne );
boiteRectangle );
boitePleine );
boutonEffacer );
new JScrollPane ( listeCouleurs ) );
new JScrollPane ( listePolices ) );
new JScrollPane ( listeTailles ) );
Container c = getContentPane();
c.setLayout( new FlowLayout( FlowLayout.LEFT ) );
c.add( p1 );
c.add( p2 );
c.add( p3 );
c.add( texte );
setSize( 300, 150 );
setLocation( 300, 0 );
show();
}
}
private class MouseHandler extends MouseAdapter {
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
public void mousePressed( MouseEvent e )
{
setHautX( e.getX() );
setHautY( e.getY() );
}
public void mouseReleased( MouseEvent e )
{
setBasX( e.getX() );
setBasY( e.getY() );
repaint();
}
}
private class GestBoutonEffacement implements ActionListener {
public void actionPerformed( ActionEvent e )
{
setEffacement();
repaint();
}
}
private class GestBoutonRadio implements ItemListener {
public void itemStateChanged( ItemEvent e )
{
if ( e.getSource() == boiteOvale )
setForme( OVALE );
else if ( e.getSource() == boiteLigne )
setForme( LIGNE );
else if ( e.getSource() == boiteRectangle )
setForme( RECT );
}
}
private class GestBoitePleine implements ItemListener {
public void itemStateChanged( ItemEvent e )
{
if ( e.getStateChange() == ItemEvent.SELECTED )
setRemplissage();
else
effacerRemplissage();
}
}
public static void main( String args[] )
{
Peintre2 app = new Peintre2();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
}
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
12.24 Écrivez un programme qui permette à l’utilisateur de choisir une forme dans un JComboBox, et qui affiche ensuite cette
forme 20 fois à des emplacements et en des tailles aléatoires dans la méthode paint. Le premier élément du JComboBox est la
forme affichée par défaut lorsque paint est appelée pour la première fois.
RÉP.:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// Solution de l’exercice 12.24.
// SelectionForme.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SelectionForme extends JFrame {
private final int CERCLE = 0;
private final int CARRE = 1;
private final int OVALE = 2;
private final int RECTANGLE = 3;
private JComboBox choix;
private int forme;
private fenetreBoiteAOutils outils;
public SelectionForme()
{
setSize( 300, 200 );
show();
outils = new fenetreBoiteAOutils();
}
public void paint( Graphics g )
{
super.paint( g );
for ( int k = 1;
int x = ( int
int y = ( int
int w = ( int
int h = ( int
k
)
)
)
)
<= 20; k ++ ) {
( Math.random()
( Math.random()
( Math.random()
( Math.random()
switch ( forme ) {
case CERCLE:
g.drawOval( x, y, w, w );
break;
case CARRE:
g.drawRect( x, y, w, w );
break;
case OVALE:
g.drawOval( x, y, w, h );
break;
case RECTANGLE:
*
*
*
*
getSize().width );
getSize().height );
getSize().width );
getSize().height );
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
g.drawRect( x, y, w, h );
break;
}
}
}
public void setForme( int s ) { forme = s; }
private class fenetreBoiteAOutils extends JFrame {
public fenetreBoiteAOutils()
{
choix = new JComboBox();
choix.addItem( "Cercle" );
choix.addItem( "Carré" );
choix.addItem( "Ovale" );
choix.addItem( "Rectangle" );
choix.addItemListener(
new ItemListener() {
public void itemStateChanged( ItemEvent e )
{
setForme( choix.getSelectedIndex() );
SelectionForme.this.repaint();
}
}
);
getContentPane().add( choix, BorderLayout.SOUTH );
pack();
setLocation( 300, 0 );
show();
}
}
public static void main( String args[] )
{
SelectionForme app = new SelectionForme();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
}
12.25 Modifiez l’exercice 12.24 pour dessiner chacune des 20 formes dimensionnées au hasard dans une couleur aléatoire parmi
les 13 objets de Color prédéfinis, arrangés dans un tableau de couleurs de classe Color.
RÉP.:
1
2
// Solution de l’exercice 12.25.
// SelectionForme2.java
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SelectionForme2 extends JFrame {
private final int CERCLE = 0;
private final int CARRE = 1;
private final int OVALE = 2;
private final int RECTANGLE = 3;
private JComboBox choix;
private int forme;
Color couleurs[] = { Color.green, Color.pink, Color.black,
Color.orange, Color.magenta,
Color.white, Color.cyan, Color.gray,
Color.darkGray, Color.blue,
Color.yellow, Color.red, Color.lightGray };
private fenetreBoiteAOutils outils;
public SelectionForme2()
{
setSize( 300, 200 );
show();
outils = new fenetreBoiteAOutils();
}
public void paint( Graphics g )
{
super.paint( g );
for ( int k = 1;
int x = ( int
int y = ( int
int w = ( int
int h = ( int
int c = ( int
k
)
)
)
)
)
<= 20; k ++ ) {
( Math.random()
( Math.random()
( Math.random()
( Math.random()
( Math.random()
*
*
*
*
*
getSize().width );
getSize().height );
getSize().width );
getSize().height );
couleurs.length );
g.setColor( couleurs[ c ] );
switch ( forme ) {
case CERCLE:
g.drawOval( x,
break;
case CARRE:
g.drawRect( x,
break;
case OVALE:
g.drawOval( x,
break;
case RECTANGLE:
g.drawRect( x,
break;
}
y, w, w );
y, w, w );
y, w, h );
y, w, h );
}
}
public void setForme( int s ) { forme = s; }
private class fenetreBoiteAOutils extends JFrame {
public fenetreBoiteAOutils()
{
choix = new JComboBox();
choix.addItem( "Cercle" );
choix.addItem( "Carré" );
choix.addItem( "Ovale" );
choix.addItem( "Rectangle" );
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
choix.addItemListener(
new ItemListener() {
public void itemStateChanged( ItemEvent e )
{
setForme( choix.getSelectedIndex() );
SelectionForme2.this.repaint();
}
}
);
getContentPane().add( choix, BorderLayout.SOUTH );
pack();
setLocation( 300, 0 );
show();
}
}
public static void main( String args[] )
{
SelectionForme2 app = new SelectionForme2();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
}
12.26 Modifiez l’exercice 12.25 pour permettre à l’utilisateur de choisir la couleur dans laquelle la forme sera dessinée à partir
d’une boîte de dialogue JColorChooser.
RÉP.:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Solution de l’exercice 12.26.
// SelectionForme3.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SelectionForme3 extends JFrame {
private final int CERCLE = 0;
private final int CARRE = 1;
private final int OVALE = 2;
private final int RECTANGLE = 3;
private JComboBox choix;
private JButton choixCouleur;
private Color couleur;
private int forme;
private fenetreBoiteAOutils outils;
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
public SelectionForme3()
{
setSize( 300, 200 );
show();
outils = new fenetreBoiteAOutils();
}
public void paint( Graphics g )
{
super.paint( g );
for ( int k = 1;
int x = ( int
int y = ( int
int w = ( int
int h = ( int
k
)
)
)
)
<= 20; k ++ ) {
( Math.random()
( Math.random()
( Math.random()
( Math.random()
*
*
*
*
getSize().width );
getSize().height );
getSize().width );
getSize().height );
g.setColor( couleur );
switch ( forme ) {
case CERCLE:
g.drawOval( x,
break;
case CARRE:
g.drawRect( x,
break;
case OVALE:
g.drawOval( x,
break;
case RECTANGLE:
g.drawRect( x,
break;
}
y, w, w );
y, w, w );
y, w, h );
y, w, h );
}
}
public void setForme( int s ) { forme = s; }
private class fenetreBoiteAOutils extends JFrame {
public fenetreBoiteAOutils()
{
choix = new JComboBox();
choix.addItem( "Cercle" );
choix.addItem( "Carré" );
choix.addItem( "Ovale" );
choix.addItem( "Rectangle" );
choix.addItemListener(
new ItemListener() {
public void itemStateChanged( ItemEvent e )
{
setForme( choix.getSelectedIndex() );
SelectionForme3.this.repaint();
}
}
);
getContentPane().add( choix, BorderLayout.SOUTH );
choixCouleur = new JButton( "Prendre couleur" );
choixCouleur.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
couleur = JColorChooser.showDialog( null,
"Prendre couleur", Color.black );
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
}
}
);
getContentPane().add( choixCouleur, BorderLayout.NORTH );
pack();
setLocation( 300, 0 );
show();
}
}
public static void main( String args[] )
{
SelectionForme3 app = new SelectionForme3();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
}
12.27 Écrivez un programme qui utilise les méthodes de l’interface MouseListener pour permettre à l’utilisateur de presser
le bouton de la souris, de tirer sur la souris et de relâcher finalement le bouton de la souris. Lorsque la souris est relâchée, tracez un
rectangle qui possède les coordonnée du coin supéreiur gauche, la largeur et la hauteur adéquates. L’astuce consiste à capturer dans
la méthode mousePressed la coordonnée du point auquel l’utilisateur presse initialement le bouton de la souris et le maintient
enfoncé, puis à capturer dans la méthode mouseReleased les coordonnées du point où l’utilisateur relâche le bouton de la souris.
Les deux méthodes doivent stocker les valeurs adéquates de coordonnées pour le calcul ultérieur des dimensions du rectangle. Tous
les calculs de largeur, de hauteur et de coordonnée du coin supérieur gauche sont effectués au niveau de la méthode paint, juste
avant le dessin de la forme.
RÉP.:
1
2
3
4
5
6
7
8
// Solution de l’exercice 12.27.
// Dessin.java
// Ce programme dessine un rectangle à l’aide de la souris.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Dessin extends JFrame {
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
private int hautX, hautY;
private int largeur, hauteur, supX, supY;
private int basX, basY;
public Dessin()
{
super( "Dessin" );
addMouseListener( new MouseHandler() );
setSize( 300, 200 );
show();
}
public
public
public
public
void
void
void
void
setHautX( int x ) { hautX
setHautY( int y ) { hautY
setBasX( int x ) { basX =
setBasY( int y ) { basY =
= x; }
= y; }
x; }
y; }
public void paint( Graphics g )
{
super.paint( g );
largeur = Math.abs( hautX - basX );
hauteur = Math.abs( hautY - basY );
supX = Math.min( hautX, basX );
supY = Math.min( hautY, basY );
g.drawRect( supX, supY, largeur, hauteur );
}
public static void main( String args[] )
{
Dessin app = new Dessin();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
private class MouseHandler extends MouseAdapter {
public void mouseReleased( MouseEvent e )
{
setBasX( e.getX() );
setBasY( e.getY() );
repaint();
}
public void mousePressed( MouseEvent e )
{
setHautX( e.getX() );
setHautY( e.getY() );
}
}
}
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
12.28 Modifiez l’exercice 12.27 pour donner un effet d’élastique tendu: lorsque l’utilisateur tire sur la souris, il voit le rectangle
dans sa taille courante et peut ainsi connaître exactement l’aspect final du rectangle lorsqu’il relâchera le bouton de la souris. L’astuce consiste ici à placer dans la méthode mouseDragged les mêmes tâches que dans mouseReleased.
RÉP.:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// Solution de l’exercice 12.28.
// Dessin3.java
// Ce programme dessine un rectangle à l’aide de la souris.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Dessin3 extends JFrame {
private int hautX, hautY;
private int largeur, hauteur, supX, supY;
private int basX, basY;
public Dessin3()
{
super( "Dessin3" );
addMouseListener( new MouseHandler() );
addMouseMotionListener( new MouseMotionHandler() );
setSize( 300, 200 );
show();
}
public
public
public
public
void
void
void
void
setHautX( int x ) { hautX
setHautY( int y ) { hautY
setBasX( int x ) { basX =
setBasY( int y ) { basY =
= x; }
= y; }
x; }
y; }
public void paint( Graphics g )
{
super.paint( g );
largeur = Math.abs( hautX - basX );
hauteur = Math.abs( hautY - basY );
supX = Math.min( hautX, basX );
supY = Math.min( hautY, basY );
g.drawRect( supX, supY, largeur, hauteur );
}
public static void main( String args[] )
{
Dessin3 app = new Dessin3();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
);
}
private class MouseHandler extends MouseAdapter {
public void mouseReleased( MouseEvent e )
{
setBasX( e.getX() );
setBasY( e.getY() );
repaint();
}
public void mousePressed( MouseEvent e )
{
setHautX( e.getX() );
setHautY( e.getY() );
}
}
private class MouseMotionHandler extends MouseMotionAdapter {
public void mouseDragged( MouseEvent e )
{
setBasX( e.getX() );
setBasY( e.getY() );
repaint();
}
}
}
12.29 Modifiez l’exercice 12.28 pour permettre à l’utilisateur de sélectionner la forme à dessiner. Un JComboBox offre des options qui reprennent au moins le rectangle, l’ovale, la ligne et le rectangle arrondi.
RÉP.:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Solution de l’exercice 12.29.
// Dessin3.java
// Ce programme dessine un rectangle à l’aide de la souris.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Dessin3 extends JFrame {
private int hautX, hautY;
private int largeur, hauteur, supX, supY;
private int basX, basY;
private final int CERCLE = 0;
private final int CARRE = 1;
private final int OVALE = 2;
private final int RECTANGLE = 3;
private JComboBox choix;
private int forme;
private fenetreBoiteAOutils outils;
public Dessin3()
{
super( "Dessin3" );
addMouseListener( new MouseHandler() );
addMouseMotionListener( new MouseMotionHandler() );
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Définir forme par défaut comme Cercle.
forme = CERCLE;
setSize( 300, 200 );
show();
outils = new fenetreBoiteAOutils();
}
public
public
public
public
public
void
void
void
void
void
setHautX( int x ) { hautX
setHautY( int y ) { hautY
setBasX( int x ) { basX =
setBasY( int y ) { basY =
setForme( int s ) { forme
= x; }
= y; }
x; }
y; }
= s; }
public void paint( Graphics g )
{
super.paint( g );
largeur = Math.abs( hautX - basX );
hauteur = Math.abs( hautY - basY );
supX = Math.min( hautX, basX );
supY = Math.min( hautY, basY );
switch ( forme ) {
case CERCLE:
g.drawOval( supX,
break;
case CARRE:
g.drawRect( supX,
break;
case OVALE:
g.drawOval( supX,
break;
case RECTANGLE:
g.drawRect( supX,
break;
}
supY, largeur, largeur );
supY, largeur, largeur );
supY, largeur, hauteur );
supY, largeur, hauteur );
}
public static void main( String args[] )
{
Dessin3 app = new Dessin3();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
private class fenetreBoiteAOutils extends JFrame {
public fenetreBoiteAOutils()
{
choix = new JComboBox();
choix.addItem( "Cercle" );
choix.addItem( "Carré" );
choix.addItem( "Ovale" );
choix.addItem( "Rectangle" );
choix.addItemListener(
new ItemListener() {
public void itemStateChanged( ItemEvent e )
{
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
setForme( choix.getSelectedIndex() );
repaint();
}
}
);
// Définir forme par défaut comme Cercle.
forme = CERCLE;
Container c = getContentPane();
c.setLayout( new BorderLayout() );
c.add( choix, BorderLayout.SOUTH );
pack();
setLocation( 300, 0 );
show();
}
}
private class MouseHandler extends MouseAdapter {
public void mouseReleased( MouseEvent e )
{
setBasX( e.getX() );
setBasY( e.getY() );
repaint();
}
public void mousePressed( MouseEvent e )
{
setHautX( e.getX() );
setHautY( e.getY() );
}
}
private class MouseMotionHandler extends MouseMotionAdapter {
public void mouseDragged( MouseEvent e )
{
setBasX( e.getX() );
setBasY( e.getY() );
repaint();
}
}
}
12.30 Modifiez l’exercice 12.29 pour permettre à l’utilisateur de choisir la couleur de tracé au départ d’une boîte de dialogue
JColorChooser.
RÉP.:
1
2
3
4
5
6
7
8
// Solution de l’exercice 12.30.
// Dessin3.java
// Ce programme dessine un rectangle à l’aide de la souris.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Dessin3 extends JFrame {
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
private
private
private
private
private
private
private
private
private
private
private
private
int hautX, hautY;
int largeur, hauteur, supX, supY;
int basX, basY;
final int CERCLE = 0;
final int CARRE = 1;
final int OVALE = 2;
final int RECTANGLE = 3;
JComboBox choix;
int forme;
fenetreBoiteAOutils outils;
JButton choixCouleur;
Color couleur;
public Dessin3()
{
super( "Dessin3" );
addMouseListener( new MouseHandler() );
addMouseMotionListener( new MouseMotionHandler() );
// Définir forme par défaut comme Cercle.
forme = CERCLE;
setSize( 300, 200 );
show();
outils = new fenetreBoiteAOutils();
}
public
public
public
public
public
void
void
void
void
void
setHautX( int x ) { hautX
setHautY( int y ) { hautY
setBasX( int x ) { basX =
setBasY( int y ) { basY =
setForme( int s ) { forme
= x; }
= y; }
x; }
y; }
= s; }
public void paint( Graphics g )
{
super.paint( g );
g.setColor( couleur );
largeur = Math.abs( hautX - basX );
hauteur = Math.abs( hautY - basY );
supX = Math.min( hautX, basX );
supY = Math.min( hautY, basY );
switch ( forme ) {
case CERCLE:
g.drawOval( supX,
break;
case CARRE:
g.drawRect( supX,
break;
case OVALE:
g.drawOval( supX,
break;
case RECTANGLE:
g.drawRect( supX,
break;
}
supY, largeur, largeur );
supY, largeur, largeur );
supY, largeur, hauteur );
supY, largeur, hauteur );
}
public static void main( String args[] )
{
Dessin3 app = new Dessin3();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
{
System.exit( 0 );
}
}
);
}
private class fenetreBoiteAOutils extends JFrame {
public fenetreBoiteAOutils()
{
choix = new JComboBox();
choix.addItem( "Cercle" );
choix.addItem( "Carré" );
choix.addItem( "Ovale" );
choix.addItem( "Rectangle" );
choix.addItemListener(
new ItemListener() {
public void itemStateChanged( ItemEvent e )
{
setForme( choix.getSelectedIndex() );
repaint();
}
}
);
Container c = getContentPane();
c.add( choix, BorderLayout.SOUTH );
choixCouleur = new JButton( "Prendre couleur" );
choixCouleur.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
couleur = JColorChooser.showDialog( null,
"Prendre couleur", Color.black );
}
}
);
c.add( choixCouleur, BorderLayout.NORTH );
pack();
setLocation( 300, 0 );
show();
}
}
private class MouseHandler extends MouseAdapter {
public void mouseReleased( MouseEvent e )
{
setBasX( e.getX() );
setBasY( e.getY() );
repaint();
}
public void mousePressed( MouseEvent e )
{
setHautX( e.getX() );
setHautY( e.getY() );
}
}
private class MouseMotionHandler extends MouseMotionAdapter {
public void mouseDragged( MouseEvent e )
{
setBasX( e.getX() );
setBasY( e.getY() );
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
143
144
145
146
repaint();
}
}
}
12.31 Modifiez l’exercice 12.30 pour permettre à l’utilisateur de spécifier si une forme est remplie ou vide lors de son dessin.
L’utilisateur sélectionne cette option pleine ou vide en cliquant dans un JCheckBox.
RÉP.:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// Solution de l’exercice 12.31.
// Dessin3.java
// Ce programme dessine un rectangle à l’aide de la souris.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Dessin3 extends JFrame {
private int hautX, hautY;
private int largeur, hauteur, supX, supY;
private int basX, basY;
private final int CERCLE = 0;
private final int CARRE = 1;
private final int OVALE = 2;
private final int RECTANGLE = 3;
private JComboBox choix;
private int forme;
private fenetreBoiteAOutils outils;
private JButton choixCouleur;
private Color couleur;
private JCheckBox rempli;
public Dessin3()
{
super( "Dessin3" );
addMouseListener( new MouseHandler() );
addMouseMotionListener( new MouseMotionHandler() );
// Définir forme par défaut à Cercle.
forme = CERCLE;
outils = new fenetreBoiteAOutils();
setSize( 300, 200 );
show();
}
public void setHautX( int x ) { hautX = x; }
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
public
public
public
public
void
void
void
void
setHautY( int y ) { hautY
setBasX( int x ) { basX =
setBasY( int y ) { basY =
setForme( int s ) { forme
= y; }
x; }
y; }
= s; }
public void paint( Graphics g )
{
super.paint( g );
g.setColor( couleur );
largeur = Math.abs( hautX - basX );
hauteur = Math.abs( hautY - basY );
supX = Math.min( hautX, basX );
supY = Math.min( hautY, basY );
if ( rempli.isSelected() )
switch ( forme ) {
case CERCLE:
g.fillOval( supX,
break;
case CARRE:
g.fillRect( supX,
break;
case OVALE:
g.fillOval( supX,
break;
case RECTANGLE:
g.fillRect( supX,
break;
}
else
switch ( forme ) {
case CERCLE:
g.drawOval( supX,
break;
case CARRE:
g.drawRect( supX,
break;
case OVALE:
g.drawOval( supX,
break;
case RECTANGLE:
g.drawRect( supX,
break;
}
supY, largeur, largeur );
supY, largeur, largeur );
supY, largeur, hauteur );
supY, largeur, hauteur );
supY, largeur, largeur );
supY, largeur, largeur );
supY, largeur, hauteur );
supY, largeur, hauteur );
}
public static void main( String args[] )
{
Dessin3 app = new Dessin3();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
private class fenetreBoiteAOutils extends JFrame {
public fenetreBoiteAOutils()
{
choix = new JComboBox();
choix.addItem( "Cercle" );
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
choix.addItem( "Carré" );
choix.addItem( "Ovale" );
choix.addItem( "Rectangle" );
choix.addItemListener(
new ItemListener() {
public void itemStateChanged( ItemEvent e )
{
setForme( choix.getSelectedIndex() );
repaint();
}
}
);
Container c = getContentPane();
c.add( choix, BorderLayout.SOUTH );
choixCouleur = new JButton( "Prendre couleur" );
choixCouleur.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
couleur = JColorChooser.showDialog( null,
"Prendre couleur", Color.black );
}
}
);
c.add( choixCouleur, BorderLayout.NORTH );
rempli = new JCheckBox( "Rempli" );
c.add( rempli, BorderLayout.CENTER );
pack();
setLocation( 300, 0 );
show();
}
}
private class MouseHandler extends MouseAdapter {
public void mouseReleased( MouseEvent e )
{
setBasX( e.getX() );
setBasY( e.getY() );
repaint();
}
public void mousePressed( MouseEvent e )
{
setHautX( e.getX() );
setHautY( e.getY() );
}
}
private class MouseMotionHandler extends MouseMotionAdapter {
public void mouseDragged( MouseEvent e )
{
setBasX( e.getX() );
setBasY( e.getY() );
repaint();
}
}
}
COPYRIGHT 2001 LES ÉDITIONS REYNALD GOULET INC. TOUTE REPRODUCTION INTERDITE.
12.32 (Programme de dessin) À l’aide des techniques des exercices 9.28, 9.29, 12.27 à 12.30 et des techniques graphiques du
chapitre 11, réécrivez l’exercice 12.31 pour permettre à l’utilisateur de dessiner différentes formes et de stocker chaque forme dans
un tableau de formes. Si vous avez un peu d’ambition, investiguez parmi les possibilités de la classe Vector, présentée au chapitre
23. Dans le cadre de ce programme, créez vos propres classes, telles que celles de la hiérarchie de classes décrite aux exercices 9.28
et 9.29, dont vous créerez des objets pour stocker chacune des formes que l’utilisateur dessine. Ces classes mémorisent l’emplacement, les dimensions et la couleur de chaque forme, ainsi que le fait qu’elle soit remplie ou vide. Toutes ces classes doivent dériver
d’une même classe nommée MaForme, qui dispose de toutes les caractéristiques communes à tous les types de formes. Toute sousclasse de MaForme dispose de sa propre méthode dessiner, qui renvoie un void et attend en argument un objet Graphics.
Lors de l’appel de la méthode paint de la fenêtre d’application, la méthode doit parcourir le tableau de formes et afficher chaque
forme par polymorphisme par l’entremise de l’appel à la méthode dessiner (en lui passant l’objet Graphics en argument). La
méthode dessiner de chaque forme doit savoir où et comment dessiner la forme. Le programme doit au moins offrir les classes
suivantes: MaLigne, MonOvale, MonRect, MonRectArrondi. Concevez une hiérarchie de classes qui facilite la réutilisation
de logiciel et placez toutes vos classes dans le package formes. Importez ce package dans le programme.
12.33 Modifiez l’exercice 12.32 pour doter le programme d’un bouton Annuler qui permette l’annulation répétitive des dernières
opérations de dessin. Si aucune forme n’est présente dans le tableau de formes, désactivez le bouton Annuler.
Téléchargement