1

Voilà je voudrais ajouter des scroll sur mon JTextArea (scroll vertical).
J'ai essayé à peu près tout ce qui était possible et ça ne marche pas.

voici la déclaration de mon JTextArea :
[code]final JTextArea zoneSaisie = new JTextArea(25,27);[/code]

Merci de me donner vos idées pour la déclaration et l'implémentation du JScrollPane. Je n'ai pas réussit.
/ JAVA / C / C++ / Cobol /

2

Il faut ajouter le textarea dans le jscrollpane.
Je dois avoir un exemple quelque part, un instant ! (c'est un set qq chose, pas un add)

3

jScrollPane= new JScrollPane() ;
jScrollPane.setViewportView(getJTextArea()) ;

4

Cela me renvoie l'erreur suivante à la compilation :


Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Tab count: 1
at javax.swing.JTabbedPane.checkIndex(Unknown Source)
at javax.swing.JTabbedPane.setSelectedIndex(Unknown Source)
at Fenetre$1.actionPerformed(Fenetre.java:41)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
/ JAVA / C / C++ / Cobol /

5

confus
je vais tenter un exemple...
Un instant.

6

import javax.swing.SwingUtilities ;
import java.awt.BorderLayout ;
import javax.swing.JPanel ;
import javax.swing.JFrame ;
import javax.swing.JScrollPane ;
import javax.swing.JTextArea ;

/**
 * 
 */

/**
 * 
 */
public class ScrollPaneDemoFrame
      extends JFrame
{

   private static final long serialVersionUID= 1L ;
   private JPanel jContentPane ;
   private JScrollPane jScrollPane ;
   private JTextArea jTextArea ;



   /**
    * This method initializes jScrollPane
    * 
    * @return javax.swing.JScrollPane
    */
   private JScrollPane getJScrollPane()
   {
      if ( jScrollPane == null ) {
         jScrollPane= new JScrollPane() ;
         jScrollPane.setViewportView(getJTextArea()) ;
      }
      return jScrollPane ;
   }



   /**
    * This method initializes jTextArea
    * 
    * @return javax.swing.JTextArea
    */
   private JTextArea getJTextArea()
   {
      if ( jTextArea == null ) {
         jTextArea= new JTextArea() ;
      }
      return jTextArea ;
   }



   /**
    * @param args
    */
   public static void main( String[] args )
   {
      // TODO Auto-generated method stub

      SwingUtilities.invokeLater(new Runnable() {
         public void run()
         {
            ScrollPaneDemoFrame thisClass= new ScrollPaneDemoFrame() ;
            thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
            thisClass.setVisible(true) ;
         }
      }) ;
   }



   /**
    * This is the default constructor
    */
   public ScrollPaneDemoFrame()
   {
      super() ;
      initialize() ;
   }



   /**
    * This method initializes this
    * 
    * @return void
    */
   private void initialize()
   {
      this.setSize(300, 200) ;
      this.setContentPane(getJContentPane()) ;
      this.setTitle("JFrame") ;
   }



   /**
    * This method initializes jContentPane
    * 
    * @return javax.swing.JPanel
    */
   private JPanel getJContentPane()
   {
      if ( jContentPane == null ) {
         jContentPane= new JPanel() ;
         jContentPane.setLayout(new BorderLayout()) ;
         jContentPane.add(getJScrollPane(), BorderLayout.CENTER) ;
      }
      return jContentPane ;
   }

}



PS : ton problème est à l'exécution, pas à la compilation wink (et accessoirement n'a visiblement aucun rapport avec le JScrollPane tongue)

7

D'après ton stackTarce l'erreure est probablement a la ligne 41 du fichier Fenetre.java. J'ai l'impression que tudoit vouloir utiliser un Tabbed pane qui n'existe pas.
avatar

8

Bon j'ai résolu tous les problèmes dus aux onglets.
J'ai quand meme quelques problèmes : Il n'y a aucune erreur, mais lorsque je créé un onglet, le nouvel onglet s'affiche bien, mais pas le JTextArea dans lequel j'ai placé mes JScrollPane...
Et si je supprime la dernière ligne qui définit le JTextArea auquel doit s'appliquer le JScrollPane, le JTextArea fonctionne bien.. mais lorsque je les remet dans le code, le JTextArea ne s'affiche plus :/

 
public void actionPerformed(ActionEvent arg0) {
				NOMBRE_ONGLETS++;
				try{
					onglets.setSelectedIndex(onglets.getSelectedIndex()+1);
				}catch(IndexOutOfBoundsException e){
					actualiseMenu();
				}
				
				JScrollPane jScrollPane= new JScrollPane() ; 
				jScrollPane.setViewportView(((JTextArea)onglets.getComponentAt(onglets.getSelectedIndex()))) ;
}


Mes JTextArea sont anonymes, mais ça ne devrait pas poser de problème..
Il n'y a que la dernière ligne qui pose problème.

Pourtant je récupère bien dans onglets, ma barre d'onglets, l'onglet en court : getComponentAt(onglets.getSelectedIndex()) et je récupère le Component interne à cet onglet (il n'y a que ça : un JTextArea), et je cast ce Component en JTextArea. Je précise aussi que cette manip fonctionne partout dans mon programme... :/
/ JAVA / C / C++ / Cobol /

9

Heu, déjà, le jscrollpane il faudrait peut être en faire quelque chose (i.e. l'ajouter à un composant !)
Comment ton jtextarea peut il être affiché si tu ne l'ajoute à aucun composant et que tu ne l'ajoute pas au viewportview du scrollpane ?

10

Relis mon exemple wink
L'idée est d'ajouter le JTextarea dans le JScrollPane – qui n'a été ajouté dans aucun JComponent – via setViewportView, puis d'ajouter ton JScrollPane dans un JComponent smile

11

mais il faut le mettre lui-même dans un conteneur, ton jscrollpane, a priori (double cross)
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

12

Mon JTextArea est ajouté à l'onglet de cette manière :
onglets.addTab("Sans titre "+NOMBRE_ONGLETS, new JTextArea());

Effectivement la ligne est sur mon code mais je l'ai pas ici donc ma fonction c'est ça :
public void actionPerformed(ActionEvent arg0) {
				NOMBRE_ONGLETS++;
				onglets.addTab("Sans titre "+NOMBRE_ONGLETS, new JTextArea());

				try{
					onglets.setSelectedIndex(onglets.getSelectedIndex()+1);
				}catch(IndexOutOfBoundsException e){;}

				JScrollPane jScrollPane= new JScrollPane() ; 
				JOptionPane.showMessageDialog(null, ""+onglets.getSelectedIndex());
				jScrollPane.setViewportView(((JTextArea)onglets.getComponentAt(onglets.getSelectedIndex()))) ;
}


Tu entends quoi par "ajouter le jscrollpane à un composant" ? Faire qqchse dans le style :
((JTextArea)onglets.getComponentAt(onglets.getSelectedIndex())).add(jScrollPane;
?

Et qu'entends-tu par "ajouter le jtextarea au viewportwiew du scroll pane" ? Ce n'est pas ce que je fais déjà ici ? :
jScrollPane.setViewportView(((JTextArea)onglets.getComponentAt(onglets.getSelectedIndex()))) ;
/ JAVA / C / C++ / Cobol /

13

OK je comprends ce que tu veux dire.
J'ai ajouté le jtextarea dans le jscrollpane, mais ce dernier n'est dans rien, c'est ça ?
/ JAVA / C / C++ / Cobol /

14

À vue de nez, je dirais que dans ton onglets.addTab il faut ajouter le jscrollpane à la place de la jtextarea. Ensuite la jtextarea n'est ajoutée qu'au viewport.
Ainsi tu as une hiérarchie de conteneurs : l'onglet contient un jscrollpane dont le viewport contient ta textarea.
Si tu fais autrement, tu as un onglet qui contient directement une textarea, et par ailleurs cette textarea est aussi contenue dans un scrollpane (déjà là je sais même pas si c'est vraiment possible, être contenu dans deux trucs différents à la fois, ça doit pas bien marcher en tous cas), mais ce scrollpane, n'étant contenu dans rien, n'est pas affiché !
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

15

présent, lorsque je fait : ((JTextArea)onglets.getComponentAt(onglets.getSelectedIndex()))Exact cela fonctionne. Mais cela chamboule tout mon code, car à, cela ne fonctionne bien-sur plus !

J'ai essayé de faire :
((JTextArea)((JScrollPane)onglets.getComponentAt(onglets.getSelectedIndex())).getComponent(0));
Mais en fait, j'obtiens non pas un JTextArea, mais un JViewport, que je ne peux donc pas caster en (JtextArea)..
J'ai essayé de récupérer ce qu'il y avait dans le JScrollPane, je sais pas ce que j'obtiens, mais c'est pas mon JTextArea lol !!

une idée ? après je vous laisse tranquille ;-)
/ JAVA / C / C++ / Cobol /

16

Je vais regarder l'API
Je suppose qu'il y a plus adapté que getComponent(0)

17

Mercii
/ JAVA / C / C++ / Cobol /

18

JTextArea jta= (JTextArea)jScrollPane.getViewport().getView() ;
Tu utilises quoi comme IDE ? Sans connaitre ça m'a pris quelques secondes pour trouver ça avec Eclipse ^^
On essaie de regarder ce qu'il propose avec "jscrollpane.getv" vu qu'on veut le symétrique de setviewport, il propose getViewport() => on prend, puis on veut récupérer la view vu que le symétrique était setViewPortView, il propose getView, on teste => "et voilà" grin
Bon, rien n'empêche de vérifier sur la doc de l'API ensuite, hein grin

19

mdr...

eclipse xD
/ JAVA / C / C++ / Cobol /

20

Ben quoi ? Il fonctionne particulièrement bien, quand même tongue
(avec un PC tout juste correct ça fonctionne bien, même avec mon P4@1.8Ghz chez moi...)

21

hé mais non ça va pas.
Avec ta ligne, tu as la meme chose que ce que moi j'avais trouvé avec :
((JTextArea)(((JViewport)(((JScrollPane)onglets.getComponentAt(onglets.getSelectedIndex())).getComponent(0))).getComponent(0)))
(qui est bcp moins propre, je te l'accorde ;-) )


Cependant cela ne me renvoit pas le JTextArea mais un truc assez complexe (j'obtiens des caractères comme du code HTML.. avec des balises et tout et tout).


J'obtiens notamment une erreur ici :
if(!((JTextArea) onglets.getComponentAt(onglets.getSelectedIndex())).getText().equals("")){
					JOptionPane.showConfirmDialog(new Frame(), "Voulez-vous enregistrer les \nmodifications de \""+onglets.getTitleAt(onglets.getSelectedIndex())+"\" ?", "Excalipad", JOptionPane.YES_NO_OPTION);
}


Erreur :
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JScrollPane cannot be cast to javax.swing.JTextArea

Ce qui prouve bien que je n'obtiens pas le contenu de mon JTextArea, non ?
/ JAVA / C / C++ / Cobol /

22

J'ai testé avant de poster et chez moi ça renvoie bien le même JTextArea.
Je regarde ton code, un instant.
(c'est pas normal qu'il essaie de caster un scrollpane vers un textarea hum)

import javax.swing.SwingUtilities ;
import java.awt.BorderLayout ;
import javax.swing.JPanel ;
import javax.swing.JFrame ;
import javax.swing.JScrollPane ;
import javax.swing.JTextArea ;

/**
 * 
 */

/**
 * 
 */
public class ScrollPaneDemoFrame
      extends JFrame
{

   private static final long serialVersionUID= 1L ;
   private JPanel jContentPane ;
   private JScrollPane jScrollPane ;
   private JTextArea jTextArea ;



   /**
    * This method initializes jScrollPane
    * 
    * @return javax.swing.JScrollPane
    */
   private JScrollPane getJScrollPane()
   {
      if ( jScrollPane == null ) {
         jScrollPane= new JScrollPane() ;
         jScrollPane.setViewportView(getJTextArea()) ;
         JTextArea jta= (JTextArea)jScrollPane.getViewport().getView() ;
         
         System.out.println(getJTextArea().hashCode()) ;
         System.out.println(jta.hashCode()) ;
      }
      return jScrollPane ;
   }



   /**
    * This method initializes jTextArea
    * 
    * @return javax.swing.JTextArea
    */
   private JTextArea getJTextArea()
   {
      if ( jTextArea == null ) {
         jTextArea= new JTextArea() ;
      }
      return jTextArea ;
   }



   /**
    * @param args
    */
   public static void main( String[] args )
   {
      // TODO Auto-generated method stub

      SwingUtilities.invokeLater(new Runnable() {
         public void run()
         {
            ScrollPaneDemoFrame thisClass= new ScrollPaneDemoFrame() ;
            thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
            thisClass.setVisible(true) ;
         }
      }) ;
   }



   /**
    * This is the default constructor
    */
   public ScrollPaneDemoFrame()
   {
      super() ;
      initialize() ;
   }



   /**
    * This method initializes this
    * 
    * @return void
    */
   private void initialize()
   {
      this.setSize(300, 200) ;
      this.setContentPane(getJContentPane()) ;
      this.setTitle("JFrame") ;
   }



   /**
    * This method initializes jContentPane
    * 
    * @return javax.swing.JPanel
    */
   private JPanel getJContentPane()
   {
      if ( jContentPane == null ) {
         jContentPane= new JPanel() ;
         jContentPane.setLayout(new BorderLayout()) ;
         jContentPane.add(getJScrollPane(), BorderLayout.CENTER) ;
      }
      return jContentPane ;
   }

}

23

Tiens, voilà ce que me renvoit le code :

javax.swing.JTextArea[,0,0,0x0,invalid,layout=javax.swing.plaf.basic.BasicTextUI$UpdateHandler,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.basic.BasicBorders$MarginBorder@1858610,flags=296,maximumSize=,minimumSize=,preferredSize=,caretColor=sun.swing.PrintColorUIResource[r=51,g=51,b=51],disabledTextColor=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],editable=true,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],selectedTextColor=sun.swing.PrintColorUIResource[r=51,g=51,b=51],selectionColor=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],colums=0,columWidth=0,rows=0,rowHeight=0,word=false,wrap=false]
/ JAVA / C / C++ / Cobol /

24

-
if(!((JTextArea) onglets.getComponentAt(onglets.getSelectedIndex())).getText().equals("")){


+
JScrollPane jsp= (JScrollPane)onglets.getComponentAt(onglets.getSelectedIndex())) ;
JTextArea jta= (JtextArea)jsp.getViewport().getView() ;
if ( jta.getText().length() > 0 ){
} 

?


cross : ./23 : c'est quoi qui te renvoie ça ? (et comment ? avec un toString() ?)

25

if(!(((JTextArea)((JScrollPane)onglets.getComponentAt(onglets.getSelectedIndex()))).getViewpor().getView()).length != 0)){
					JOptionPane.showConfirmDialog(new Frame(), "Voulez-vous enregistrer les \nmodifications de \""+onglets.getTitleAt(onglets.getSelectedIndex())+"\" ?", "Excalipad", JOptionPane.YES_NO_OPTION);
}


Retourne : "Inpossible de convertir JScrollPane en JTextArea".


Clairement : Je veux pouvoir récupérer le texte de mon JTextArea contenu dans mon JScrollPane, et la méthode :
(JTextArea)jScrollPane.getViewport().getView().getText();
...ne me renvoit pas cela.
/ JAVA / C / C++ / Cobol /

26

problème de parenthèses :

voilà ce que donne ton code (c'est pas pour rien que j'ai introduit des variables intermédiaires tongue)
      (
            ((JTextArea) 
            
            ((JScrollPane)onglets.getComponentAt(onglets.getSelectedIndex()))
            
      ).getViewport().getView()) 



il faudrait

      (
            (JTextArea) (
            
            ((JScrollPane)onglets.getComponentAt(onglets.getSelectedIndex()))
            
      ).getViewport().getView()) 

je crois... M'enfin coupe ton code !

27

lancelot (./25) :
Clairement : Je veux pouvoir récupérer le texte de mon JTextArea contenu dans mon JScrollPane, et la méthode :
(JTextArea)jScrollPane.getViewport().getView().getText();
...ne me renvoit pas cela.



attention à tes parenthèses tongue
((JTextArea)jScrollPane.getViewport().getView()).getText();

28

./26 : en fait ça doit plutôt être ça :
(JTextArea)((JScrollPane)onglets.getComponentAt(onglets.getSelectedIndex())).getViewport().getView())
enfin bref, tu vois l'idée !

29

Cela ne fonctionne pas vraiment...

La condition :
if(!(((JTextArea)(((JScrollPane)onglets.getComponentAt(onglets.getSelectedIndex())).getViewport().getView())).getText().length() != 0)){
					JOptionPane.showConfirmDialog(new Frame(), "Voulez-vous enregistrer les \nmodifications de \""+onglets.getTitleAt(onglets.getSelectedIndex())+"\" ?", "Excalipad", JOptionPane.YES_NO_OPTION);
}


Donne :
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JScrollPane cannot be cast to javax.swing.JTextArea


D'autre part,
System.out.println(""+(JTextArea)((JScrollPane)onglets.getComponentAt(onglets.getSelectedIndex())).getViewport().getView());
Affiche :
javax.swing.JTextArea[,0,0,0x0,invalid,layout=javax.swing.plaf.basic.BasicTextUI$UpdateHandler,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.basic.BasicBorders...
/ JAVA / C / C++ / Cobol /

30

J'ai trouvé :
((JTextArea)((((JScrollPane)onglets.getComponentAt(onglets.getSelectedIndex())).getViewport()).getView()))

Merci à tous !!!
/ JAVA / C / C++ / Cobol /