OVH Cloud OVH Cloud

Questions Swing et AWT

4 réponses
Avatar
stormz
Bonjour.

J'ai quelques questions à propos de Swing et AWT.
Je suis en train de faire une application avec une interface graphique
contenant des images, des boutons, une arborescence (jTree).

1) Est ce normal que l'on doit mélanger des classes Swing et AWT ?
2) J'essaye de faire quelque chose d'à peu près esthétique. Pour ça
j'utilise des composants JPanel et des Layout. Un des mes problèmes et
que je ne peux pas créer une image (un logo par exemple) et la placer
ou je veux.
3) Est ce qu'il existe un typde de Layout qui me laisse libre de
placer les composants ou je veux par rapport aux axes x et y par
exemple?
4) J'essaye de placer un texte correctement. Le problème c'est qu'il
est assez long et pas formater (pas de retour chariot). J'aimerai donc
avoir un composant à qui je donne une longueur et qui determine
automatiquement la largeur en fonction de la taille du texte, en
mettant des retour chario là où il faut. Y'a t'il un composant
suceptible de faire ça?

merci

--
storm

4 réponses

Avatar
Isidore
"storm" a écrit dans le message de
news:
Bonjour.

J'ai quelques questions à propos de Swing et AWT.
Je suis en train de faire une application avec une interface graphique
contenant des images, des boutons, une arborescence (jTree).

1) Est ce normal que l'on doit mélanger des classes Swing et AWT ?
2) J'essaye de faire quelque chose d'à peu près esthétique. Pour ça
j'utilise des composants JPanel et des Layout. Un des mes problèmes et
que je ne peux pas créer une image (un logo par exemple) et la placer
ou je veux.
3) Est ce qu'il existe un typde de Layout qui me laisse libre de
placer les composants ou je veux par rapport aux axes x et y par
exemple?
4) J'essaye de placer un texte correctement. Le problème c'est qu'il
est assez long et pas formater (pas de retour chariot). J'aimerai donc
avoir un composant à qui je donne une longueur et qui determine
automatiquement la largeur en fonction de la taille du texte, en
mettant des retour chario là où il faut. Y'a t'il un composant
suceptible de faire ça?

merci

--
storm


----------------------------------------------------------------------------
---------

Salut Storm!
Voici mes réponses aux questions que tu te poses ...
J'espère qu'elles t'aideront ...


1°) Quelques informations sur la bibliothèque Swing:

La bibliothèque Swing est plus récente et plus performante que AWT.
Elle ne remplace pas totalement AWT, elle est plutôt "à côté". Ses
composants sont, pour l'essentiel, compatible avec AWT. Des composants
de fonctionnalité identique à AWT se retrouvent dans Swing. Ils ont
d'ailleurs
les mêmes noms préfixés par "J".
Donc pour répondre à cette question, je te dirais que NON il n'est pas
obligatoire de mélanger les composants Swing et AWT. Perso, je n'utilise que
la bibliothèque Swing et j'ai jamais eu de problème avec !

2°) et 3°) Placement des composants:

Le placement des composants dans un réceptacle (Container) se fait au moyen
de gestionnaires de placement (layout manager). Il en existe plusieurs:

BorderLayout --> place les composants dans cinq zones, le centre et les 4
côtés.
CardLayout --> définit des fiches superposées.
FlowLayout --> range les composants ligne par ligne, de gauche à droite.
GridLayout --> range les composants dans un tableau à 2 dimensions.
GridBagLayout --> gestionnaire sophistiqué qui range les composants dans une
grille
topologique en X (horizontalement) et en Y (verticalement). Les emplacements
sont
désignés par des entiers. Ces entiers ne signifient nullement une mesure de
la position
mais servent à positionner les composants les uns par rapport aux autres:
horizontalement la position i+1 est à droite de la position i, et
verticalement j+1 est
en dessous de j. Dans cette grille, un composant occupe une certaine zone
dont la
largeur et la hauteur sont également indiquées en nombre de positions de
cellule.
Pour chaque composant, on indique comment il est cadré dans sa zone, au
centre,
à gauche, à droite, en bas ou en haut et quelles sont les marges autour du
composant
dans sa zone. On indique comment la zone allouée au composant se comporte
lors
d'une modification de taille de son réceptacle: deux nombres réels fixent le
taux
d'extension relative de la zone allouée au composant par rapport aux autres
composants
du même réceptacle.
On fixe également les directions d'extension du composant dans sa zone
lorsqu'il dispose
de plus de place que nécessaire: aucune extension, extension en largeur, en
hauteur ou
dans les deux directions.

Ce gestionnaire est très puissant mais difficile à utiliser.
C'est pourquoi je te propose une encapsulation de sont utilisation dans une
classe appelée
Placement qui offre les services les plus utiles. L'appel général est:
Placement.p(cont, comp, x, y, w, h, cadrage, t, l, b, r, wx, wy, fill)
cont --> réceptacle de type Container dans lequel est placé le composant.
comp --> le composant.
x, y --> position du coin nord-ouest du composant.
w,h --> largeur et hauteur de la zone allouée au composant.
cadrage --> cadrage du composant dans sa zone, valeurs possibles:
GridBagConstraints.CENTER = au centre,
GridBagConstraints.NORTH = en haut,
GridBagConstraints.EAST = à droite,
GridBagConstraints.SOUTH = en bas,
GridBagConstraints.WEST = à gauche.
t, l, b, r --> marge autour du composant dans sa zone, en haut, à gauche, en
bas, à droite.
wx, wy --> poids du taux d'extension horizontale et verticale de la zone
allouée.
fill --> direction(s) d'extension du composant dans sa zone, valeurs
possibles:
GridBagConstraints.NONE = aucune extension,
GridBagConstraints.HORIZONTAL = horizontal,
GridBagConstraints.VERTICAL = vertical,
GridBagConstraints.BOTH = les deux directions.

La classe placement offre également des versions simplifiées de la méthode
p(), obtenues en
fixant des valeurs par défaut pour certains paramètres:

class Placement {
static GridBagLayout placeur = new GridBagLayout();
static GridBagConstraints c = new GridBagConstraints();

// PROCEDURE GENERALE DE PLACEMENT:
public static void p(Container cont, Component comp,
int x, int y, int w, int h, int cadrage,
int t, int l, int b, int r, double wx,
double wy, int fill) {
cont.setLayout(placeur);
c.gridx = x; c.gridy = y; c.gridwidth = w; c.gridheight = h;
c.fill = fill;
c.anchor = cadrage;
c.weigthx = wx; c.weigthy = wy;
c.insets = new Insets(t, l, b, r);
placeur.setConstraints(comp, c); cont.add(comp);
}

//PLACEMENT D'UN COMPOSANT QUI NE GROSSIT PAS:
public static void p(Container cont, Component comp,
int x, int y, int w, int h, int cadrage, int
t, int l, int b, int r) {
p(cont, comp, x, y, w, h, cadrage, t, l, b, r, 0.0, 0.0,
GridBagConstraints.NONE);
}

//PLACEMENT D'UN COMPOSANT SANS MARGES QUI NE GROSSIT PAS:
public static void p(Container cont, Component comp,
int x, int y, int w, int h, int cadrage) {
p(cont, comp, x, y, w, h, cadrage, 0, 0, 0, 0, 1.0, 1.0,
GridBagConstraints.NONE);
}

//PLACEMENT AU CENTRE D'UN COMPOSANT SANS MARGES
QUI NE GROSSIT PAS:
public static void p(Container cont, Component comp,
int x, int y, int w, int h) {
p(cont, comp, x, y, w, h, GridBagConstraints.CENTER,
0, 0, 0, 0, 1.0, 1.0, GridBagConstraints.NONE);
}
}

4°) Je ne crois pas, non. A toi de le créer ou de ruser avec ceux déjà
existant !

1°) à nouveau ...

Contrairement à une Frame, on ne peut PAS utiliser une JFrame comme
conteneur.
Les composants doivent être placés dans un conteneur associé, obtenu par la
méthode
getContentPane. Voici par exemple comment programmer le placement d'une zone
de
texte dans une JFrame:

...
JFrame f = ... ;
JTextField texte = new JTextField(20);
...
Placement.p(f.getContentPane(), texte, 1,1,1,1);
...

Pour donner un aperçu de la grande variété des composants offerts par Swing,
voici quelques
classes de cette bibliothèque:

JScrollPane --> rectangle d'observation (view port) qui encapsule un
composant et que l'on peut
déplacer au moyen de curseurs (scroll bar).
JMenuBar, JMenu, JMenuItem --> pour disposer des menus déroulants. On peut
placer une
barre de menus
(JMenuBar) à une fenêtre de type JFrame
ou JApplet. On peut
ajouter des menus (JMenu) à la barre
de menu, composés de
rubrique (JMenuItem). Chaque
rubrique peut être
dotée d'écouteurs de type ActionListener.
JTree --> visualisation de données sous forme d'un graphe arborescent.
JSlider --> barrette dotée d'un curseur pour acquérir des données numériques
de type "contrôle
de niveau".
JTabbedPane --> affichge à onglets.
JTable --> visualisation de tables.
...



Ciao ...

Avatar
storm
Isidore wrote:
"storm" a écrit dans le message de
news:

Bonjour.

J'ai quelques questions à propos de Swing et AWT.
Je suis en train de faire une application avec une interface graphique
contenant des images, des boutons, une arborescence (jTree).

1) Est ce normal que l'on doit mélanger des classes Swing et AWT ?
2) J'essaye de faire quelque chose d'à peu près esthétique. Pour ça
j'utilise des composants JPanel et des Layout. Un des mes problèmes et
que je ne peux pas créer une image (un logo par exemple) et la placer
ou je veux.
3) Est ce qu'il existe un typde de Layout qui me laisse libre de
placer les composants ou je veux par rapport aux axes x et y par
exemple?
4) J'essaye de placer un texte correctement. Le problème c'est qu'il
est assez long et pas formater (pas de retour chariot). J'aimerai donc
avoir un composant à qui je donne une longueur et qui determine
automatiquement la largeur en fonction de la taille du texte, en
mettant des retour chario là où il faut. Y'a t'il un composant
suceptible de faire ça?

merci

--
storm



----------------------------------------------------------------------------
---------

Salut Storm!
Voici mes réponses aux questions que tu te poses ...
J'espère qu'elles t'aideront ...


1°) Quelques informations sur la bibliothèque Swing:

La bibliothèque Swing est plus récente et plus performante que AWT.
Elle ne remplace pas totalement AWT, elle est plutôt "à côté". Ses
composants sont, pour l'essentiel, compatible avec AWT. Des composants
de fonctionnalité identique à AWT se retrouvent dans Swing. Ils ont
d'ailleurs
les mêmes noms préfixés par "J".
Donc pour répondre à cette question, je te dirais que NON il n'est pas
obligatoire de mélanger les composants Swing et AWT. Perso, je n'utilise que
la bibliothèque Swing et j'ai jamais eu de problème avec !

2°) et 3°) Placement des composants:

Le placement des composants dans un réceptacle (Container) se fait au moyen
de gestionnaires de placement (layout manager). Il en existe plusieurs:

BorderLayout --> place les composants dans cinq zones, le centre et les 4
côtés.
CardLayout --> définit des fiches superposées.
FlowLayout --> range les composants ligne par ligne, de gauche à droite.
GridLayout --> range les composants dans un tableau à 2 dimensions.
GridBagLayout --> gestionnaire sophistiqué qui range les composants dans une
grille
topologique en X (horizontalement) et en Y (verticalement). Les emplacements
sont
désignés par des entiers. Ces entiers ne signifient nullement une mesure de
la position
mais servent à positionner les composants les uns par rapport aux autres:
horizontalement la position i+1 est à droite de la position i, et
verticalement j+1 est
en dessous de j. Dans cette grille, un composant occupe une certaine zone
dont la
largeur et la hauteur sont également indiquées en nombre de positions de
cellule.
Pour chaque composant, on indique comment il est cadré dans sa zone, au
centre,
à gauche, à droite, en bas ou en haut et quelles sont les marges autour du
composant
dans sa zone. On indique comment la zone allouée au composant se comporte
lors
d'une modification de taille de son réceptacle: deux nombres réels fixent le
taux
d'extension relative de la zone allouée au composant par rapport aux autres
composants
du même réceptacle.
On fixe également les directions d'extension du composant dans sa zone
lorsqu'il dispose
de plus de place que nécessaire: aucune extension, extension en largeur, en
hauteur ou
dans les deux directions.

Ce gestionnaire est très puissant mais difficile à utiliser.
C'est pourquoi je te propose une encapsulation de sont utilisation dans une
classe appelée
Placement qui offre les services les plus utiles. L'appel général est:
Placement.p(cont, comp, x, y, w, h, cadrage, t, l, b, r, wx, wy, fill)
cont --> réceptacle de type Container dans lequel est placé le composant.
comp --> le composant.
x, y --> position du coin nord-ouest du composant.
w,h --> largeur et hauteur de la zone allouée au composant.
cadrage --> cadrage du composant dans sa zone, valeurs possibles:
GridBagConstraints.CENTER = au centre,
GridBagConstraints.NORTH = en haut,
GridBagConstraints.EAST = à droite,
GridBagConstraints.SOUTH = en bas,
GridBagConstraints.WEST = à gauche.
t, l, b, r --> marge autour du composant dans sa zone, en haut, à gauche, en
bas, à droite.
wx, wy --> poids du taux d'extension horizontale et verticale de la zone
allouée.
fill --> direction(s) d'extension du composant dans sa zone, valeurs
possibles:
GridBagConstraints.NONE = aucune extension,
GridBagConstraints.HORIZONTAL = horizontal,
GridBagConstraints.VERTICAL = vertical,
GridBagConstraints.BOTH = les deux directions.

La classe placement offre également des versions simplifiées de la méthode
p(), obtenues en
fixant des valeurs par défaut pour certains paramètres:

class Placement {
static GridBagLayout placeur = new GridBagLayout();
static GridBagConstraints c = new GridBagConstraints();

// PROCEDURE GENERALE DE PLACEMENT:
public static void p(Container cont, Component comp,
int x, int y, int w, int h, int cadrage,
int t, int l, int b, int r, double wx,
double wy, int fill) {
cont.setLayout(placeur);
c.gridx = x; c.gridy = y; c.gridwidth = w; c.gridheight = h;
c.fill = fill;
c.anchor = cadrage;
c.weigthx = wx; c.weigthy = wy;
c.insets = new Insets(t, l, b, r);
placeur.setConstraints(comp, c); cont.add(comp);
}

//PLACEMENT D'UN COMPOSANT QUI NE GROSSIT PAS:
public static void p(Container cont, Component comp,
int x, int y, int w, int h, int cadrage, int
t, int l, int b, int r) {
p(cont, comp, x, y, w, h, cadrage, t, l, b, r, 0.0, 0.0,
GridBagConstraints.NONE);
}

//PLACEMENT D'UN COMPOSANT SANS MARGES QUI NE GROSSIT PAS:
public static void p(Container cont, Component comp,
int x, int y, int w, int h, int cadrage) {
p(cont, comp, x, y, w, h, cadrage, 0, 0, 0, 0, 1.0, 1.0,
GridBagConstraints.NONE);
}

//PLACEMENT AU CENTRE D'UN COMPOSANT SANS MARGES
QUI NE GROSSIT PAS:
public static void p(Container cont, Component comp,
int x, int y, int w, int h) {
p(cont, comp, x, y, w, h, GridBagConstraints.CENTER,
0, 0, 0, 0, 1.0, 1.0, GridBagConstraints.NONE);
}
}

4°) Je ne crois pas, non. A toi de le créer ou de ruser avec ceux déjà
existant !

1°) à nouveau ...

Contrairement à une Frame, on ne peut PAS utiliser une JFrame comme
conteneur.
Les composants doivent être placés dans un conteneur associé, obtenu par la
méthode
getContentPane. Voici par exemple comment programmer le placement d'une zone
de
texte dans une JFrame:

...
JFrame f = ... ;
JTextField texte = new JTextField(20);
...
Placement.p(f.getContentPane(), texte, 1,1,1,1);
...

Pour donner un aperçu de la grande variété des composants offerts par Swing,
voici quelques
classes de cette bibliothèque:

JScrollPane --> rectangle d'observation (view port) qui encapsule un
composant et que l'on peut
déplacer au moyen de curseurs (scroll bar).
JMenuBar, JMenu, JMenuItem --> pour disposer des menus déroulants. On peut
placer une
barre de menus
(JMenuBar) à une fenêtre de type JFrame
ou JApplet. On peut
ajouter des menus (JMenu) à la barre
de menu, composés de
rubrique (JMenuItem). Chaque
rubrique peut être
dotée d'écouteurs de type ActionListener.
JTree --> visualisation de données sous forme d'un graphe arborescent.
JSlider --> barrette dotée d'un curseur pour acquérir des données numériques
de type "contrôle
de niveau".
JTabbedPane --> affichge à onglets.
JTable --> visualisation de tables.
...



Ciao ...




Super reponse!
merci!

--
storm


Avatar
MERIGON Olivier
2) J'essaye de faire quelque chose d'à peu près esthétique. Pour ça
j'utilise des composants JPanel et des Layout. Un des mes problèmes et
que je ne peux pas créer une image (un logo par exemple) et la placer
ou je veux.



Salut,
setLayout(null), en suite tu peux faire des setLocation() avec tes
composants.
Ca marchait avec AWT, je sais pas avec Swing.


Olivier


Avatar
Xavier Tarrago
Petit complément :
Avec Swing, si on met explicitement un layout à null, il n'y a pas de
gestion du placement des éléments. En clair, les éléments sont à la position
spécifiée et n'en bougent pas. En général, ce n'est pas ce qui est
souhaitable si on veut que le panneau puisse être redimensionné. Mais bon,
c'est toi qui vois...
On peut calculer les dimensions d'un texte avec la classe FontMetrics
doc ici : http://java.sun.com/j2se/1.4.1/docs/api/java/awt/FontMetrics.html
tutorial ici :
http://java.sun.com/docs/books/tutorial/uiswing/painting/drawingText.html
plein de choses à http://java.sun.com/ recherche de FontMetrics

"storm" a écrit dans le message de
news:
Bonjour.

J'ai quelques questions à propos de Swing et AWT.
Je suis en train de faire une application avec une interface graphique
contenant des images, des boutons, une arborescence (jTree).

1) Est ce normal que l'on doit mélanger des classes Swing et AWT ?
2) J'essaye de faire quelque chose d'à peu près esthétique. Pour ça
j'utilise des composants JPanel et des Layout. Un des mes problèmes et
que je ne peux pas créer une image (un logo par exemple) et la placer
ou je veux.
3) Est ce qu'il existe un typde de Layout qui me laisse libre de
placer les composants ou je veux par rapport aux axes x et y par
exemple?
4) J'essaye de placer un texte correctement. Le problème c'est qu'il
est assez long et pas formater (pas de retour chariot). J'aimerai donc
avoir un composant à qui je donne une longueur et qui determine
automatiquement la largeur en fonction de la taille du texte, en
mettant des retour chario là où il faut. Y'a t'il un composant
suceptible de faire ça?

merci

--
storm