# Java > Interfaces Graphiques en Java > AWT/Swing >  Application avec interface graphique en java

## wallace27

Bonjour,

Je souhaiterais crer une application java trs simple et basique avec intelliJ qui me permettrait de crer une liste d'lments et de la grer (en supprimant et ajoutant des lments). Le tout avec une interface graphique contenant trois choses. Un bouton ajouter, une fentre contenant la liste de mes lments et un bouton supprimer. Pour ce qui concerne linterface graphique je compte utiliser GUI Form. Par contre je ne sais pas encore comment stocker ma liste dlments. Est-ce que vous me conseillez dutiliser une LinkedList ?

Merci pour vos conseils.

----------


## neuromencien

Je ne connais pas GUI Form mais si a se comporte comme Swing tu n'as pas besoin de stocker ta liste d'lments si ces lments sont relativement simples. Normalement ton composant graphique "Liste" doit avoir un modle derrire. Au lieu de faire un modle de String, tu fais un modle qui contient tes lments (normalement tu dois avoir une implmentation de base qui prend une collection type) et tu dfinit un renderer qui affichera ce que tu veux comme texte dans la liste. Ainsi lorsque tu voudra rcuprer tes lments tu auras juste  les lire depuis le modle de ton composant "Liste".

Cependant si tu tenais absolument  te taper la synchro entre le composant et ta propre collection, une LinkedList pourrait coller mais n'apporte pas grand chose. Tu gagneras en temps de suppression et d'insertion et perdra en temps de parcours. Sauf que dans une GUI, comme il n'y a aucune chance que ton utilisateur puisse insrer manuellement 100 000 lments  la seconde, cette optimisation ne se verra jamais. Idem pour le temps de parcours la dgradation ne se verra jamais non plus. Donc tu peux prendre n'importe quelle implmentation de List a ne changera rien dans l'absolu.

----------


## wallace27

Merci beaucoup pour la rponse. Je vais donc me concentrer sur le GUI. Voici un exemple de ce que je souhaiterais russir  obtenir comme rsultat : 




Est-ce que vous auriez un tutoriel ou une vido-tutorielle  me conseiller qui me guiderait tape par tape pour obtenir le rsultat ci-dessus en utilisant Intellij IDEA ?

Merci pour votre aide.

----------


## wallace27

Pour la partie GUI j'ai commenc par crer un champ texte "descriptionTache" dans lequel j'entre le nom de la tche  effectuer, ensuite un bouton "ajouterTache" qui est cens faire entrer le nom de la tche dans la liste et enfin la JList qui va contenir les tches que je lui ajoute : 




Maintenant, voici mon code. Je ne sais pas par o commencer pour faire en sorte que le clic sur le bouton "ajouterTache" puisse provoquer l'insertion dans la JList du contenu du champ texte "descriptionTache" : 




```

```

----------


## wallace27

Donc plus personne ne peut m'aider c'est juste ? Ca se termine ici si je comprends bien. Il n'est mme pas possible d'avoir juste une piste ou un indice de ce que je dois faire ?

----------


## neuromencien

Dsol je n'ai pas eu le temps de revenir sur ce fil depuis ce week-end.

[Edit : je n'avais pas lu le code que tu as post et je me suis rendu compte que ma rponse ne correspondait pas  ton besoin, donc je change].

En fait tu n'es pas loin du tout de la solution:

Regarde la JavaDoc de JList. Elle t'explique que si tu ne fournis pas de modle elle en crera un par dfaut pour toi mais il sera read-only. Elle t'indique aussi que si tu veux pouvoir faire des modifs dans la liste, Swing met  ta disposition la classe DefaultListModel.

Il te faut donc juste modifier ta cration de liste comme a:


```

```

Et dans l'action du bouton tu fais a:
[CODE]model.addElement(myTextBox.getText()); //Le textbox qui contient le nom de la tche.[CODE]

A la fin quand tu veux rcuprer le contenu de ta liste tu peux faire


```
model.elements()
```

En passant, tu n'as pas besoin de ce bout de code:



```

```

----------


## Pill_S

> Est-ce que vous me conseillez dutiliser une LinkedList ?


De nos jours, on ne conseille plus jamais  personne d'utiliser LinkedList. ArrayList offre de bien meilleures perfs, et (tonnement) quel que soit le cas d'utilisation. Cela vient du fait que les tableaux sont des structures de donnes cache-friendly, car contiges. Cf la prz d'un cador  devoxx:

----------


## wallace27

Merci beaucoup pour ton aide. Est-ce que tu me conseilles d'utiliser une JList ? Car je ne sais pas trop quoi choisir d'autre ci-dessous :

----------


## neuromencien

La JList semble un composant graphique adapt si tu veux afficher une liste d'lments oui. Il faut que tu dcorrle le composant graphique et la structure de donnes. Et dans ton cas la structure de donnes (un Vector dans le cas du DefaultListModel) ira trs bien.

Mais si tu veux stocker plusieurs infos (genre un nom de tche et une description, voir un id ce serait pas mal) il te faudra un objet complexe.



```

```

Ton modle deviendra un DefaultListModel<Task> et il faudra un renderer pour que la liste affiche le nom de la tche (list.setCellRenderer(cellRenderer); )

L'avantage de cette construction c'est que tes donns sont  un seul endroit et que tu n'as pas besoin de faire de synchro entre un ventuelle ArrayList et le composant JList.

----------


## wallace27

Donc si je veux crer ce "DefaultListModel"  partir de ma JList que j'ai appele lstTaskList je dois procder comme ci-dessous c'est juste ? Ou je fais fausse route ?




Et ensuite ici je vais dans component listener ?

----------


## neuromencien

Je n'en ai pas la moindre ide, je ne connais pas ton EDI. Cependant pour moi ce n'est pas du cot des ComponentListeners qu'il faut chercher mais du cot des paramtres du constructeur de la JList.
Je te conseillerai plutt de passer par la vue code, d'aller  l'endroit o ta liste est instancie (je ne vois pas ce bout de code dans ce que tu as copi mais logiquement a devrait tre dans le constructeur ou une mthode appele  la construction de ta fentre) et d'instancier le modle la main pour pouvoir le passer au constructeur de la JList (comme dans le code que j'ai dit dans une de mes rponses prcdentes).

----------


## wallace27

A quel endroit de ce code : 



```

```

est-ce que je peux mettre le code ci-dessous ?



```

```

----------


## wallace27

D'abord une question plus basique. Comment je fais pour faire apparatre champ de saisie et faire apparatre le bouton lorsque j'excute mon code : 




```

```




Qu'est-ce qui manque  mon code pour ne serait-ce que faire apparatre les bouton et le champ de saisie et en passant je regrette de toutes les forces le jour maudit de merde o j'ai dcid de faire de la programmation parce que je suis en train de gcher ma vie sur des chiures de mouches.

----------


## neuromencien

Je ne sais pas trop si a vaut le coup de te rpondre parce que tu risques de mal prendre ma prochaine remarque et de te vexer, mais a pourra toujours servir pour d'autres personnes: la programmation c'est un mtier. Les tentatives pour apprendre  Mr tout le monde  programmer juste en cliquant sur 2 bouton c'est soit un rve, soit rserv  un cas super spcialis. Ca suppose d'acqurir un certain nombre de connaissances et a ne se fait pas en 5 min. C'est gnralement un investissement important.

Pour rpondre  ta premire question:



```

```

Pour rpondre  ta deuxime question: il manque toutes les initialisation dans ton code. L'EDI n' pas fait de miracle (d'ailleurs je dirais mme qu'il  fait de la m... par rapport  un WindowsBuilder sous Eclipse ou alors c'est que tu ne l'as pas utilis correctement). Pour crer un objet (et donc un composant graphique) il faut utiliser le mot cl new. Tu n'as rien cr, donc il n'y a rien qui s'affiche, logique.

Je te conseille de commencer par les bases, cad peut-tre un tuto sur la programmation Java et un tuto sur la programmation graphique avec Swing.

----------


## wallace27

j'ai fait new --> GUI Form

----------


## wallace27

Voil avec ce code : 



```

```

J'arrive  faire apparatre ceci :

----------


## wallace27

Maintenant si je parviens  ajouter dans la JListl le texte qui est dans le grand champ TextArea que je crois que je crie directement au miracle. Parce que je a fait une semaine que je me prends la tte avec a :

----------


## neuromencien

Les captures d'cran que tu nous montre elle viennent de l'EDI ou c'est quand tu excutes que tu vois a? Parce que pour moi a ne colle pas. Il n'y a rien dans ton code (tu ne cres que la frame) et tu sembles utiliser des classes Swing (cf les imports). Donc soit tu ne montres pas tout le code, soit c'est l'EDI qui te montre une pure vue de l'esprit... 

Quoi qu'il en soit voil le code qui fait ce que tu veux: C'est bourrin (je n'ai pas retouch le code gnr par WindowBuilder au dbut) mais a te donnera un exemple qui fonctionne.



```

```

----------


## wallace27

C'est quand j'excute que je vois ce que je vous mets en capture d'cran.

----------


## wallace27

Je ne sais pas comment te remercier. T'es un grand.

----------


## wallace27

J'ai russi  corriger mon code et maintenant il compile. Je parviens  ajouter une tche dans la JList sur pression du bouton ajouter grce  mon code ci-dessous. Dernire chose que je dois faire maintenant, c'est implmenter le bouton "supprimer" en exigeant qu'une ligne soit slectionne dans la JList avant de pouvoir cliquer sur supprimer et qu'ensuite la suppression
soit effective. 



```

```

----------


## neuromencien

Ce dont tu as besoin en fait c'est de changer l'tat du bouton "supprimer" lorsqu'on slectionne un lment dans la liste. L'tat du bouton se change via la mthode setEnabled() de la classe JButton. Et pour tre inform qu'une action se produit sur un composant tu dois enregistrer un listener pour cette action sur le composant (par exemple pour le bouton c'est via addActionListener()). Dans ton cas tu veux tre notifi des changements de slection donc tu dois chercher sur le composant JList une mthode qui te permettrait d'ajouter le listener qui va bien. Dernire tape: tu fais ta suppression dans l'action du bouton supprimer.

----------


## wallace27

Voici une tentative : 



```

```

Et j'ai ajout cette ligne dans le constructeur : 



```
btnSupprimer.setEnabled(false);
```

Et a fonctionne, car le bouton "supprimer" ne devient "cliquable" qu'aprs seulement avoir slectionn un lment de la JList.

Maintenant il ne me reste plus qu' trouver le code me permettant d'effectuer la suppression.

----------


## wallace27

Voici un dbut de code : 



```

```

----------


## neuromencien

Effectivement pour le bouton c'est a : initialisation dans le constructeur puis changement de l'tat lorsque la slection change.
Ensuite pour l'action c'est le contraire de ce que tu as fais sur le bouton "add". Dans le code du bouton "add" tu ajoutes un lment dans le modle. La logique voudrait donc que tu dispose de l'opration inverse aussi dans le modle.

----------


## wallace27



----------


## wallace27

Quelle est la fonction susceptible de supprimer l'lment slectionn d'une liste ?

----------


## wallace27

J'ai trouv une fonction qui marche, c'est la fonction ci-dessous : 




```

```

Mais elle supprimer tous les lments de la liste directement, tandis que je souhaite faire en sorte que seuls les lments slectionns soient supprims. 

Merci pour votre aide.

----------


## joel.drigo

Salut,

Pour supprimer un lment slectionn


```
model.removeElementAt(list.getSelectedIndex());
```

Pour supprimer plusieurs slectionns, tu peux rcuprer tous les indices par list.getSelectedIndices(). Et faire une boucle pour les supprimer un  un. Attention, comme supprimer un lment va dcaler les index, il faut le faire depuis le dernier jusqu'au premier, ou dcaler  chaque index si tu le fais dans l'ordre.


```

```

----------


## wallace27

Magistral a fonctionne, c'est exactement ce que je voulais. Excellent !

Merci beaucoup.

----------


## wallace27

Ci-dessous comment puis-je faire en sorte qu' aprs avoir tap du texte dans le champ texte, le bouton "Ajouter" s'active automatiquement ? Car avec mon code je suis oblig d'crire et ensuite de presser enter avant de voir le bouton "Ajouter" s'activer : 



```

```

----------


## joel.drigo

Tu peux rendre actif ou inactif le bouton par la mthode JButton.setEnabled(boolean). Comme tu veux le rendre actif lordqu'il y a quelque chose de saisi dans un champ  et inactif lorsqu'il n'y en a pas, la valeur boolenne doit dpendre de la prsence d'un texte non vide dans le champ :



```
btnAdd.setEnabled( !textField.getText().isEmpty() );
```

(ou btnAdd.setEnabled( !textField.getText()trim().isEmpty() ); si en plus tu veux que le bouton soit inactif si on a saisi que des espaces dans le champs.

Comme tu veux que ceci soit effectu ds qu'on saisit dans le champ (ou plutt ds qu'on change la saisie dans le champ, parce qu'on peut le faire par frappe au clavier mais aussi par copier/coller, ou autre), il faut dtecter les chamgements dans le modle du JTextField. Le modle d'une JTextField est un Document et on l'obtient par JTextField.getDocument(). Ensuite, on peut couter les changements dans le modle du document par un DocumentListener. Quelque soit le changement (ajout, remplacement ou suppression), il faut excuter le code ci-dessus.

Soit en rsum :


```

```

----------


## wallace27

D'accord, merci. Et si j'utilise un JTextArea c'est mort ? Impossible de dtecter le changement lors de saisies dans le champ ?

----------


## wallace27

J'ai russi  contourner mon problme en utiliser un addFocusListener. J'ai fait en sorte que ds qu'on clique dans le champ JTextArea, le bouton ajouter s'activer et qu'il se dsactiver aussitt qu'on clique ailleurs que dans la champ JTextArea (mais  condition que le champ soit vide, sinon le bouton ajouter reste actif mme si on clique ailleurs que dans le champ JTextArea).

----------


## wallace27

Quel code me permet-il de fermer mon application sur pression d'un JButton ?

Est-ce que ceci est correct  ?



```

```

----------


## joel.drigo

> D'accord, merci. Et si j'utilise un JTextArea c'est mort ? Impossible de dtecter le changement lors de saisies dans le champ ?


C'est exactement pareil pour un JTextArea. Pour tous les JTextComponent en fait(JTextField extends JTextComponent, JTextArea extends JTextComponent, JEditorPane extends JTextComponent, JTextPane extends JEditorPane extends JTextComponent, JFormattedTextField extends JTextField extends JTextComponent, JPasswordField extends JTextComponent...).





> Quel code me permet-il de fermer mon application sur pression d'un JButton ?
> 
> Est-ce que ceci est correct  ?
> 
> 
> 
> ```
> 
> ```


C'est un peu brutal, mais, oui, on peut arrter l'application ainsi.

----------


## wallace27

Et quelque chose de moins brutal donnerait quoi ?

----------


## joel.drigo

Cela dpend de ton application et de ce que tu as  faire lorsque tu la fermes. Peut-tre faut-il par exemple demander  l'utilisateur s'il veut sauvegarder sa saisie en cours, s'il ne s'est pas tromp en cliquant sur le bouton, etc. Peut-tre y a t-il des ressources  librer aussi (des connexions  une base  fermer, par exemple). Du point de vue du code, si tu as une JFrame, tu peux par exemple fermer cette JFrame par la mthode dispose().

----------


## wallace27

Juste encore une question purement thorique, dans le code ci-dessous qu'est-ce qui doit tre considr comme une mthode ? Qu'est-ce qui doit tre considr comme une fonction ? Qu'est-ce qui doit tre considr comme une classe ? Qu'est-ce qui doit tre considr comme un constructeur, comme un getter, comme un setter ?




```

```

----------


## neuromencien

Il manque une partie du code. Par extrapolation on peut supposer que tu as une classe qui s'appelle GuiForm (donc la classe c'est tout le bloc entre "public class GuiForm {" et "}" ). Ton constructeur est tout ce qui est entre "public GuiForm() {" et  "}".
Petite particularit, tu as une seconde classe avec 


```

```

En Java on appelle a une classe anonyme dans le sens ou tu as fais un new sur une classe qui n'existe pas (ActionListener est une interface, donc non instanciable) et donc le compilateur en  cr une pour toi. Cette classe n'a aucune existence en dehors de ton bloc.

Une mthode c'est une fonction d'une classe 



```

```

Petit apart: joel.drigo  t bien aimable de rpondre  ta question sur le choix des mthodes remove. Personnellement j'avais choisi de te laisser chercher et je trouve dommage que tu ne l'ai pas fait Je ne suis pas prof mais j'ai du mal  envisager qu'un lve ingnieur (puisque c'est ce que tu es si j'ai bien compris) n'ait pas t capable de choisir tout seul entre 4 mthodes remove en 4 jours, soit avec la JavaDoc soit en exprimentant.

----------


## wallace27

Encore une petite question concernant la javadoc. Lorsque je commente une fonction et que je me rfre  une autre fonction, je souhaiterais utiliser le @see. Or, je remarque que le @see ne peut apparat qu'en tout dbut de ligne et non  l'intrieur d'un texte. Y a-t-il une raison ? Ou une mthode pour le faire apparatre  l'intrieur de la phrase d'un commentaire ?

----------


## neuromencien

@See c'est une notion de "voir aussi" pour indiquer qu'il pourrait tre pertinent d'aller consulter la doc d'autres fonctions en rapport avec le sujet.
Pour faire un lien vers une autre classe ou mthode au sein d'un commentaire tu as {@link MyClass#myMethod()}.

----------

