hilpers


  hilpers > comp.lang.* > comp.lang.java

 #1  
29/12/2017, 16h40
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.

 #2  
30/12/2017, 19h29
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 :
[..].
L'IDE résout les problèmes métaphysiques à notre place !
 #3  
30/12/2017, 19h49
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 :
> [..].
> 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+
 #4  
30/12/2017, 21h31
Yliur
Le 30 Dec 2017 17:49:37 GMT
bloiiing <bloiiing.invalid> a écrit :

> Yvon Nedonchelle wrote:
> 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.
 #5  
31/12/2017, 19h44
bloiiing
Yliur wrote:

> 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?

> 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.
 #6  
01/01/2018, 21h43
Yliur
Le 31 Dec 2017 17:44:07 GMT
bloiiing <bloiiing.invalid> a écrit :

> Yliur wrote:
> 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 ?

> 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.
 #7  
04/01/2018, 03h33
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+
 #8  
08/01/2018, 01h24
Yliur
Le 04 Jan 2018 01:33:44 GMT
bloiiing <bloiiing.invalid> a écrit :

> Yliur wrote:
> 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.

Discussions similaires
ensemble scrollable de checkbuttons

Pas de container qui implémente scrollable?

Conteneur scrollable

Formulaire scrollable


Fuseau horaire GMT +2. Il est actuellement 15h01. | Privacy Policy