JPanel scrollable ou pas?

7 réponses
Avatar
bloiiing
Bonjour,

Je suis en train d'essayer de mettre une JScrollPane sur un JPanel et je
n'y arrive pas. Est-ce que je suis obligé dans ce cas d'implémenter
l'interface Scrollable sur une classe de type JPanel? Ou bien est-ce que
je peux le faire sans ça?

Je pose la question car dans la doc, JPanel n'implémente pas l'interface
Scrollable.

Et si je dois implémenter cette interface, qu'est-ce que je dois
implémenter à l'intérieur de mon JPanel pour avoir ma JScrollBar?

Merci d'avance.

7 réponses

Avatar
Yvon Nedonchelle
Le Fri, 29 Dec 2017 14:40:45 +0000, bloiiing a écrit :
Bonjour,
Je suis en train d'essayer de mettre une JScrollPane sur un JPanel et je
n'y arrive pas. Est-ce que je suis obligé dans ce cas d'implémenter
l'interface Scrollable sur une classe de type JPanel? Ou bien est-ce que
je peux le faire sans ça?
Je pose la question car dans la doc, JPanel n'implémente pas l'interface
Scrollable.
Et si je dois implémenter cette interface, qu'est-ce que je dois
implémenter à l'intérieur de mon JPanel pour avoir ma JScrollBar?
Merci d'avance.

Bonjour.
Utiliser Java en direct c'est bien pour apprendre, mais pour écrire des
programmes il est beaucoup plus simple et efficace d'utiliser Java à
travers un environnement de développement comme NETBEANS IDE. voir ici :
https://netbeans.org/.
L'IDE résout les problèmes métaphysiques à notre place !
--
Yvon http://vertgalant.pagesperso-orange.fr/
Avatar
bloiiing
Yvon Nedonchelle wrote:
Bonjour.
Utiliser Java en direct c'est bien pour apprendre, mais pour écrire des
programmes il est beaucoup plus simple et efficace d'utiliser Java à
travers un environnement de développement comme NETBEANS IDE. voir ici :
https://netbeans.org/.
L'IDE résout les problèmes métaphysiques à notre place !

Ok. Merci pour la réponse, mais j'utilise Eclipse et je ne sais pas si
en changeant pour Netbeans, ça résoudrait ce problème particulier.
Je vais peut-être choisir une autre option que des JPanel si je n'ai
pas la réponse à cette question...
Merci quand-même.
Au passage, est-ce que quelqu'un sait comment faire monter ou descendre
des éléments d'une JList. À la souris ou en clicquant sur un bouton
up/down? Si j'arrive à faire ça, je n'aurais plus besoin de mon JPanel.
Par contre j'ai trouvé beaucoup d'exemples de d'implémentations de
JList, mais aucune ne fait ça...
A+
Avatar
Yliur
Le 30 Dec 2017 17:49:37 GMT
bloiiing a écrit :
Yvon Nedonchelle wrote:
Utiliser Java en direct c'est bien pour apprendre, mais pour écrire
des programmes il est beaucoup plus simple et efficace d'utiliser
Java à travers un environnement de développement comme NETBEANS
IDE. voir ici : https://netbeans.org/.
L'IDE résout les problèmes métaphysiques à notre place !

Ok. Merci pour la réponse, mais j'utilise Eclipse et je ne sais pas si
en changeant pour Netbeans, ça résoudrait ce problème particulier.

Non, ça n'a pas grand chose à voir. Sauf que l'outil te propose
peut-être de réaliser tes interfaces graphiquement, mais je ne sais pas
ce que donne le code généré ensuite...
Je suis en train d'essayer de mettre une JScrollPane sur un JPanel
et je n'y arrive pas. Est-ce que je suis obligé dans ce cas
d'implémenter l'interface Scrollable sur une classe de type JPanel?
Ou bien est-ce que je peux le faire sans ça?


Je vais peut-être choisir une autre option que des JPanel si je n'ai
pas la réponse à cette question...

La javadoc de JScrollPane explique le concept et comment les éléments
s'imbriquent.
De mémoire, tu place ton JScrollPane quelque part (dans un
composant) puis tu positionnes un composant à l'intérieur, ce qui
permettra de faire défiler la vue sur ce composant. Et ça se fait avec
JScrollPane.setViewportView (composant)
je pense (le panneau défilant JScrollPane se trouvant intégré dans un
composant parent comme tu le fait pour un autre panneau ou composant).
Merci quand-même.
Au passage, est-ce que quelqu'un sait comment faire monter ou
descendre des éléments d'une JList. À la souris ou en clicquant sur
un bouton up/down? Si j'arrive à faire ça, je n'aurais plus besoin de
mon JPanel. Par contre j'ai trouvé beaucoup d'exemples de
d'implémentations de JList, mais aucune ne fait ça...

Si tu veux pouvoir permuter des événements : je ne pense pas que ce
comportement soit prédéfini, mais tu peux sans doute l'écrire en
interceptant les événements clavier/souris sur la liste et en modifiant
le modèle de la liste (là où tu stockes les éléments affichés).
Si tu veux juste un ascenseur autour de ta liste, la solution avec
JScrollPane est la voie à suivre à mon avis.
Avatar
bloiiing
Yliur wrote:
Je suis en train d'essayer de mettre une JScrollPane sur un JPanel
et je n'y arrive pas. Est-ce que je suis obligé dans ce cas
d'implémenter l'interface Scrollable sur une classe de type JPanel?
Ou bien est-ce que je peux le faire sans ça?


Je vais peut-être choisir une autre option que des JPanel si je n'ai
pas la réponse à cette question...

La javadoc de JScrollPane explique le concept et comment les éléments
s'imbriquent.
De mémoire, tu place ton JScrollPane quelque part (dans un
composant) puis tu positionnes un composant à l'intérieur, ce qui
permettra de faire défiler la vue sur ce composant. Et ça se fait avec
JScrollPane.setViewportView (composant)
je pense (le panneau défilant JScrollPane se trouvant intégré dans un
composant parent comme tu le fait pour un autre panneau ou composant).

En fait, c'est ce que j'ai fait avec des JTextPane et ça marche très
bien car ils implémentent l'interface Scrollable. Le JPanel, lui, ne
l'implémente pas. J'avais déjà essayé ce que tu dis plus haut et ça ne
marche pas. La question c'était de savoir si il fallait implémenter
cette interface pour que ça marche? Et si oui, comment?
Merci quand-même.
Au passage, est-ce que quelqu'un sait comment faire monter ou
descendre des éléments d'une JList. À la souris ou en clicquant sur
un bouton up/down? Si j'arrive à faire ça, je n'aurais plus besoin de
mon JPanel. Par contre j'ai trouvé beaucoup d'exemples de
d'implémentations de JList, mais aucune ne fait ça...

Si tu veux pouvoir permuter des événements : je ne pense pas que ce
comportement soit prédéfini, mais tu peux sans doute l'écrire en
interceptant les événements clavier/souris sur la liste et en modifiant
le modèle de la liste (là où tu stockes les éléments affichés).

J'ai une question à ce sujet. J'ai une ArrayList que je peux transformer
en DefaultListModel. Mais quand l'utilisateur fait des modifications
dans le DefaultListModel par l'intermédiare de la JList, comment est-ce
que je peux répercuter ces modifications sur mon ArrayList de départ.
Car c'est elle que je vais sauvegarder. Est-ce que je suis obligé de
recopier tous les éléments du DefaultListModel dans une nouvelle
ArrayList? Ou existe-t-il une méthode plus simple, moins lourde?
Si tu veux juste un ascenseur autour de ta liste, la solution avec
JScrollPane est la voie à suivre à mon avis.

Non. En fait, je veux pouvoir intervertir les éléments. Les faire monter
ou descendre. Et que ce soit synchro avec la List de départ qui est une
ArrayList et que je sauvegarderai.
En tout cas, merci de m'avoir répondu. Ça m'a permis d'avancer un peu
plus.
Avatar
Yliur
Le 31 Dec 2017 17:44:07 GMT
bloiiing a écrit :
Yliur wrote:
Je suis en train d'essayer de mettre une JScrollPane sur un
JPanel et je n'y arrive pas. Est-ce que je suis obligé dans ce
cas d'implémenter l'interface Scrollable sur une classe de type
JPanel? Ou bien est-ce que je peux le faire sans ça?

Je vais peut-être choisir une autre option que des JPanel si je
n'ai pas la réponse à cette question...

La javadoc de JScrollPane explique le concept et comment les
éléments s'imbriquent.
De mémoire, tu place ton JScrollPane quelque part (dans un
composant) puis tu positionnes un composant à l'intérieur, ce qui
permettra de faire défiler la vue sur ce composant. Et ça se fait
avec JScrollPane.setViewportView (composant)
je pense (le panneau défilant JScrollPane se trouvant intégré dans
un composant parent comme tu le fait pour un autre panneau ou
composant).

En fait, c'est ce que j'ai fait avec des JTextPane et ça marche très
bien car ils implémentent l'interface Scrollable. Le JPanel, lui, ne
l'implémente pas. J'avais déjà essayé ce que tu dis plus haut et ça ne
marche pas. La question c'était de savoir si il fallait implémenter
cette interface pour que ça marche? Et si oui, comment?

J'ai un exemple chez moi qui marche, et je confirme que ça fonctionne
comme ça (pas d'interface à implémenter) :
panneauDefilant = new JScrollPane (listeAAfficher) ;
(puis placer ce panneau défilant dans autre chose)
A priori les ascenseurs devraient apparaître quand le contenu est plus
grand que la vue.
Si ça ne fonctionne pas, il faut que tu montres ton code et que tu
précises ton problème : est-ce que rien ne s'affiche, il n'y a pas les
ascenseurs, ... ?
De mémoire, un problème existe quand le composant que tu places dans la
vue défilante se cale sur l'espace qui lui est donné : au lieu de prendre
toute la place qu'il veut et que la vue défile, il s'arrange pour ne
jamais dépasser de la vue afficher et donc les ascenseurs n'apparaissent
pas.
Est-ce que tu peux essayer l'exemple ci-dessus et montrer le code
correspondant, puis indiquer ce que tu obtiens comme résultat ?
Merci quand-même.
Au passage, est-ce que quelqu'un sait comment faire monter ou
descendre des éléments d'une JList. À la souris ou en clicquant sur
un bouton up/down? Si j'arrive à faire ça, je n'aurais plus besoin
de mon JPanel. Par contre j'ai trouvé beaucoup d'exemples de
d'implémentations de JList, mais aucune ne fait ça...

Si tu veux pouvoir permuter des événements : je ne pense pas que ce
comportement soit prédéfini, mais tu peux sans doute l'écrire en
interceptant les événements clavier/souris sur la liste et en
modifiant le modèle de la liste (là où tu stockes les éléments
affichés).

J'ai une question à ce sujet. J'ai une ArrayList que je peux
transformer en DefaultListModel. Mais quand l'utilisateur fait des
modifications dans le DefaultListModel par l'intermédiare de la
JList, comment est-ce que je peux répercuter ces modifications sur
mon ArrayList de départ. Car c'est elle que je vais sauvegarder.
Est-ce que je suis obligé de recopier tous les éléments du
DefaultListModel dans une nouvelle ArrayList? Ou existe-t-il une
méthode plus simple, moins lourde?

ListModel accepte des écouteurs de type ListDataListener : tu peux
regarder dans la doc pour voir si les événements indiqués correspondent
à ce que tu veux capturer. Un essai sera peut-être nécessaire aussi.
Si tu obtiens des infos assez précises, tu pourras reporter les
modifications sur ta liste derrière.
Une autre question à traiter : est-ce que tu veux que les modifications
soient reportées en direct ou seulement lors d'une étape de validation
des données ?
Une autre option est d'écrire toi-même la classe implémentant ListModel
(l'intro de la javadoc de JList explique ce qui est important pour ça).
Avec cette solution tu devrais pouvoir obtenir des informations assez
fines sur les modifications effectuées et les reporter à l'identique sur
ta liste derrière. Voire utiliser ta liste derrière comme modèle pour la
liste graphique, en reportant toutes les opérations de lecture et
d'écriture dessus directement. Attention dans ce cas au fait que tu ne
veux pas obligatoirement les reporter directement et à réfléchir dans le
cas où cette liste de données derrière est utilisée ailleurs par le
programme.
Si tu veux juste un ascenseur autour de ta liste, la solution avec
JScrollPane est la voie à suivre à mon avis.

Non. En fait, je veux pouvoir intervertir les éléments. Les faire
monter ou descendre. Et que ce soit synchro avec la List de départ
qui est une ArrayList et que je sauvegarderai.

Je vois que JList contient des méthodes comme setDragAnebled,
setDropMode, ... : sans doute à creuser pour déplacer des éléments en
les faisant glisser.
Avatar
bloiiing
Yliur wrote:
J'ai un exemple chez moi qui marche, et je confirme que ça fonctionne
comme ça (pas d'interface à implémenter) :
panneauDefilant = new JScrollPane (listeAAfficher) ;

Ok. Mais moi je fais: JScrollPane jsp = new JScrollPane (JPanel). Et là ça ne marche plus car apparemment le JPanel n'est pas scrollable. Ou alors, il s'agit peut-être d'un problème de Layout. J'ai mis un FlowLayout dans le JPanel que je veux rendre scrollable et je rajoute des petits JPanel dedans.
Si ça ne fonctionne pas, il faut que tu montres ton code et que tu
précises ton problème : est-ce que rien ne s'affiche, il n'y a pas les
ascenseurs, ... ?

J'essayerai de résumer mon code et de le poster, mais pour l'instant je vais essayer avec une JList à la place du JPanel.
De mémoire, un problème existe quand le composant que tu places dans la
vue défilante se cale sur l'espace qui lui est donné : au lieu de prendre
toute la place qu'il veut et que la vue défile, il s'arrange pour ne
jamais dépasser de la vue afficher et donc les ascenseurs n'apparaissent
pas.

Ils n'apparaissent pas même quand je rajoute des éléments ( d'autres JPanel plus petits ) et que ça dépasse de mon JPanel que je désire scroller.
Je vois que JList contient des méthodes comme setDragAnebled,
setDropMode, ... : sans doute à creuser pour déplacer des éléments en
les faisant glisser.

Pour l'instant j'arrive à faire un drag'n drop des éléments de la liste sur un JTextPane ( seulement la String du nom de l'élément ). Mais je n'arrive pas à déplacer les éléments à l'intérieur de la JList et à les permuter. Ceci dit c'est juste un premier essai, je creuserai plus ultérieurement.
Je vais essayer de résumer mon code et le poster, mais je pense que je vais quand-même abandonner mes JPanel et me débrouiller avec une JList.
Merci à toi et A+
Avatar
Yliur
Le 04 Jan 2018 01:33:44 GMT
bloiiing a écrit :
Yliur wrote:
J'ai un exemple chez moi qui marche, et je confirme que ça
fonctionne comme ça (pas d'interface à implémenter) :
panneauDefilant = new JScrollPane (listeAAfficher) ;

Ok. Mais moi je fais: JScrollPane jsp = new JScrollPane (JPanel). Et
là ça ne marche plus car apparemment le JPanel n'est pas scrollable.
Ou alors, il s'agit peut-être d'un problème de Layout. J'ai mis un
FlowLayout dans le JPanel que je veux rendre scrollable et je rajoute
des petits JPanel dedans.

Cette solution fonctionne ? C'est le problème auquel je faisais
référence : je pense que le panneau qui se trouve directement dans le
JScrollPane prend comme taille juste ce qui apparaît à l'écran, donc
"pas besoin" de le faire défiler.
Est-ce que ça marche avec la JList dans le JScrollPane ?
Sinon essaie de fixer la taille du JPanel avec
setPreferredSize/setMinimumSize.
Ou de placer des composants dans le panneau avec BorderLayout ou
BoxLayout.