Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probl

3 réponses
Avatar
jp
Bonjour à ceux qui vont lire ce message.

Tout d'abord, je tiens à dire que je suis impressioné par l'activité des
groupes sur usenet. Ça fait longtemps que je m'en étais éloigné et c'est
un peu désertique au niveau de la fréquentation.

Je vais quand-même poser ma question en espérant que quelqu'un la lira...

Le décor: Je suis en train de progammer une application qui utilise une
JTabbedPane et des JTextPane qui sont rajoutés par l'utilisateur dans la
JTabbedPane précédemment citée. Je veux également que mes JTextPane
soient dotés d'une JScrollPane verticale en cas de besoin et pas de
scollbar en horizontal. Le texte passe automatiquement à la ligne en cas
de dépasement de la largeur de la fenètre.

Le problème: Quand je mets la JTabbedPane dans le BorderLayout.CENTER de
la JFrame qui contient l'ensemble, je peux faire un objet.paste() et ça
copie le contenu du presse-papier dans la JTextPane sélectionée par la
méthode getSelectedComponent() de la JTabbedPane. Cela me donne un
Component JTextPane actif.

Tout va bien sauf que dans ce cas, la scrollbar verticale n'apparait
jamais. Je précise qu'avant j'avais fait:

jtextPane = new JTextPane();
scroll_pane = new JScrollPane(jtextPane);
tabbedPane.addTab("JTextPane", null, jtextPane, null);

Donc j'essaye autre chose selon la documentation officielle de Java:

jtextPane = new JTextPane();
scroll_pane = new JScrollPane(jtextPane);
tabbedPane.addTab("JTextPane", null, scroll_pane, null);

En fait je mets la JSrollPane dans la JTabbedPane. Et là ça marche pour
la scrollbar verticale qui apparait bien. Sauf que maintenant je ne peux
plus faire objet.paste() car la méthode getSelectedComponent() de la
JTabbedPane me renvoie une scrollbar et non un JTextPane dans lequel
faire un paste.

A ce niveau-là, je précise que Ctrl+v marche très bien. Ce qui ne
fonctionne plus c'est la fonction paste() héritée du JTextComponent.

La question:

Est-ce que quelqu'un pourrait me dire comment pourrais-je faire paste()
dans mes JTextPane sélectionnés? Ou alors, ce que je dois changer pour
que tout fonctionne en même temps ( JScrollBar et paste() dans mes
JTextPane )?

J'ai peut-être une erreur de logique? Mais ça fait un moment que je
cherche, et je dois dire que là ça me prend la tête...

J'espère que j'ai bien exposé mon problème et je vous remercie d'avance
de m'avoir lu.

3 réponses

Avatar
Yliur
Le 07 Oct 2017 21:12:57 GMT
jp a écrit :
Tout d'abord, je tiens à dire que je suis impressioné par l'activité
des groupes sur usenet. Ça fait longtemps que je m'en étais éloigné
et c'est un peu désertique au niveau de la fréquentation.
Je vais quand-même poser ma question en espérant que quelqu'un la
lira...

J'ai bien lu ta question, mais les mystères de Swing ce n'est pas
vraiment ma spécialité...
Sur l'imbrication des composants :
Tout va bien sauf que dans ce cas, la scrollbar verticale n'apparait
jamais. Je précise qu'avant j'avais fait:
jtextPane = new JTextPane();
scroll_pane = new JScrollPane(jtextPane);
tabbedPane.addTab("JTextPane", null, jtextPane, null);
Donc j'essaye autre chose selon la documentation officielle de Java:
jtextPane = new JTextPane();
scroll_pane = new JScrollPane(jtextPane);
tabbedPane.addTab("JTextPane", null, scroll_pane, null);

Ça me paraît normal, d'après la doc de JScrollPane son constructeur
prend un composant qui sera contenu dedans ("Creates a JScrollPane that
displays the contents of the specified component [...]").
Donc la deuxième imbrication semble plus logique.
Pour ce qui est du collage, je ne l'ai jamais fait mais si je comprends
bien tu reçois un événement et en réaction à l'événement tu appelles
manuellement quelque chose comme
tabbedPane.getSelectedComponent().paste(), c'est ça ?
Sans doute avec un transtypage.
D'après la doc, getSelectedComponent est une méthode de JTabbedPane,
donc ça te permet simplement de descendre d'un niveau, c'est normal :
il y a plusieurs composants fils à ce composant et tu veux savoir
lequel est affiché. Ensuite puisque tu connais l'imbrication de tes
composants tu pourrais continuer, non ?
Par exemple, si j'ai bien compris ton imbrication :
JScrollPane scroll_pane = (JScrollPane) tabbedPane.getSelectedComponent() ;
JTextPane jtextPane = (JTextPane) scroll_pane.getComponent (0) ;
jtextPane.paste() ;
Ou bien je n'ai pas compris ton problème ?
Est-ce que tes constructions sont souvent plus complexes et tu
cherches le composant ayant le focus par exemple ? La méthode
getSelectedComponent() ne renvoie que l'onglet affiché, c'est
un cas particulier des panneaux à onglets.
Pour le focus j'ai trouvé ça, après une recherche rapide : c'est
vieux, il y a peut-être mieux maintenant...
http://baptiste-wicht.developpez.com/tutoriels/java/swing/focus/#LV
Là je pense qu'il faut préciser un peu ce que tu veux faire,
pour cibler la réponse. Par exemple comment veux-tu choisir le
composant cible du collage ?
Avatar
jp
Le Sun, 08 Oct 2017 12:54:20 +0200, Yliur a écrit :
Le 07 Oct 2017 21:12:57 GMT jp a écrit :

Bonjour,
Je te remercie pour ta réponse. Ça m'a permis de trouver la solution.
C'était ce qui suit:
jtextPane = (JTextPane) ((JViewport) ((JScrollPane)
tabbedPane.getSelectedComponent()).getComponent(0))
.getView();
Finalement le bon vieux Usenet est encore utile... :)
Avatar
jp
Le Sun, 08 Oct 2017 12:54:20 +0200, Yliur a écrit :
Le 07 Oct 2017 21:12:57 GMT jp a écrit :
Est-ce que tes constructions sont souvent plus complexes et tu cherches
le composant ayant le focus par exemple ? La méthode
getSelectedComponent() ne renvoie que l'onglet affiché, c'est un cas
particulier des panneaux à onglets.
Pour le focus j'ai trouvé ça, après une recherche rapide : c'est vieux,
il y a peut-être mieux maintenant...
http://baptiste-wicht.developpez.com/tutoriels/java/swing/focus/#LV
Là je pense qu'il faut préciser un peu ce que tu veux faire,
pour cibler la réponse. Par exemple comment veux-tu choisir le composant
cible du collage ?

C'est un problème qui ne va pas tarder à se poser. Je te remercie
également d'avoir anticipé mes éventuelles questions. Je pense que je
vais pouvoir m'en sortir avec ces infos.
Merci encore!