IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

ScrollPane + JTextArea s'adapte à la fenètre


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2013
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 24
    Points : 20
    Points
    20
    Par défaut ScrollPane + JTextArea s'adapte à la fenètre
    Bonjour
    J'ai un JTextArea dans une JFrame, et j voudrais que le JTextArea s'adapte à la taille de la JFrame de cette manière :
    Quand on agrandit la JFrame, le JText s'agrandit d'autant
    Quand on rapetisse la JFrame, le JText reste comme il était précédemment avec un éventuel ScrollPane qui apparait si besoin. (ou au pire qui est tout le temps present par défaut)

    J'ai ça pour l'instant mais ca ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    JFrame.setDefaultLookAndFeelDecorated(true);
    frame.setBounds(0,0,800,600);
     
    JTextArea textArea = new JTextArea( );
    JScrollPane scrollPane = new JScrollPane(textArea);
    textArea.setSize(frame.getWidth(),frame.getHeight());
    scrollPane.setVisible(true);
    scrollPane.setWheelScrollingEnabled(true);
    scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    frame.getContentPane().add(textArea);
    Si quelqu'un à une idée
    merci

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,


    le positionnement et le dimensionnement de composant Swing s'effectue par LayoutManager.

    Tu verras que l'instance de classe utilisé comme content pane pour la frame a une méthode setLayoutManager(LayoutManager manager)

    Il suffit de lui passer donc une instance de LayoutManager.


    Regarder dans la FAQ pour plus de détail
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Par contre, au sujet du code que tu as fait, je note :

    - lorsqu'on utilise un JScrollPane pour scroller sur un composant, c'est le scrollPane qu'on met dans le conteneur parent (ici le contentPane de ta frame), pas le composant scrollé, sinon il est sorti du JScrollPane pour être mis dans l'autre composant au moment du add(...)
    - pour utiliser un JScrollPane, il y a un minimum d'informations à indiquer pour qu'il sache comment faire défiler le composant qu'il contient
    Regarde ce lien pour plus de détail.

    A noter qu'un JPanel ou un JTextArea (tout ce qui implémente Scrollable) est plus moins déjà préparé à être contenu dans un JScrollPane est sera donc plus facile à gérer.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2013
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 24
    Points : 20
    Points
    20
    Par défaut
    Merci pou ta réponse rapide.

    Je fonctionnais avec WindowBuilder car il me semblait que ca allait être plus rapide, mais en fait c'est assez difficile à utiliser je trouve. Du coup j'avais un AbsoluteLayout sur ma frame, mais c'est pas très adapté à ce que je veux faire.

    Finalement, je me sers d'un BorderLayout, et maintenant mon texte s'adapte à la taille de la fenètre, mais pas moyen de scroller :

    Note : this est une JFrame avec un BorderLayout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
                    JPanel centerPanel = new JPanel();
    		centerPanel.setLayout(new BorderLayout());
    		this.add(centerPanel, BorderLayout.CENTER);
     
    		// Text to print
    		JTextArea textArea = new JTextArea("BLABLABLABLA");
    		textArea.setEditable(false);
     
    		//ScroolPane
    		JScrollPane scrollPane = new JScrollPane(textArea);
    		scrollPane.setVisible(true);
    		scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    		scrollPane.setViewportView(textArea);
    		scrollPane.setWheelScrollingEnabled(true);
     
    		centerPanel.add(scrollPane, BorderLayout.EAST);
    		centerPanel.add(textArea, BorderLayout.CENTER);

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    La JTextArea se trouvant dans le JScrollPane, absolument pas besoin de l'ajouter en plus dans ta JFrame. C'est même la source de ton problème. Car un composant instancié ne peut se trouve qu'à un et un seul endroit dans ton interface graphique.

    de même, les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JScrollPane scrollPane = new JScrollPane(textArea);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scrollPane.setViewportView(textArea);
    Sont redondantes. pas besoin du setViewPortView qui est déjà appelé dans le constructeur.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2013
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 24
    Points : 20
    Points
    20
    Par défaut
    d'accord :
    Citation Envoyé par sinok Voir le message
    La JTextArea se trouvant dans le JScrollPane, absolument pas besoin de l'ajouter en plus dans ta JFrame. C'est même la source de ton problème. Car un composant instancié ne peut se trouve qu'à un et un seul endroit dans ton interface graphique.
    j'ai donc supprimé la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    centerPanel.add(textArea, BorderLayout.CENTER);
    de même, les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JScrollPane scrollPane = new JScrollPane(textArea);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scrollPane.setViewportView(textArea);
    Sont redondantes. pas besoin du setViewPortView qui est déjà appelé dans le constructeur.
    et la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    centerPanel.add(textArea, BorderLayout.CENTER);
    mais
    cette fois ci, le texte ne s'affiche pas du tout... Je suis un peu paumé avec les GUI en java

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Déjà oui en effet il fallait supprimer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    centerPanel.add(textArea, BorderLayout.CENTER);
    mais ton scrollpane est dans la partie EAST qui n'est pas une zone qui s'étend comme la zone CENTER. fait donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    centerPanel.add(scrollPane, BorderLayout.CENTER);
    Question subsidiaire : ton centerPanel, il est mis dans la fenêtre à un moment, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    frame.getContentPane().add(centerPanel);
    ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2013
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 24
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Question subsidiaire : ton centerPanel, il est mis dans la fenêtre à un moment, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    frame.getContentPane().add(centerPanel);
    ?
    Oui oui

    Alors j'ai changé ce que tu as dit, et ca marche
    Mes erreurs venaient du fait que je considérais le scrollPane comme un élément à part, c'est pour ca que je voulais le mettre dans son BorderEast et que je l'ajoutais en plus d'ajouter le texte.
    Grace à vous j'ai compris, merci

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par jklms Voir le message
    Oui oui

    Alors j'ai changé ce que tu as dit, et ca marche
    Mes erreurs venaient du fait que je considérais le scrollPane comme un élément à part, c'est pour ca que je voulais le mettre dans son BorderEast et que je l'ajoutais en plus d'ajouter le texte.
    Grace à vous j'ai compris, merci
    C'est bien un élément à part, mais il faut voir la GUI comme une arborescence : des composants dans des composants.

    Quand tu fais : new JScrollPane(textarea) tu mets le textarea dans le JScrollPane, lui même mis dans un JPanel (centerPanel), lui même mis dans le content pane de ta frame, lui même mis dans la frame.
    Tu vois l'arbo : un composant ne pouvant être mis toujours qu'à un seul endroit dans l'arbo, et que dans une seule arbo. (et seul les composants de type composite (Container en AWT/SWING) peuvent contenir d'autres composants.

    En parallèle, le LayoutManager mis sur un composant est là pour déterminer les emplacements et tailles des composants se trouvant directement dans ce composant, selon des règles qui lui sont propres

    Il est important de connaitre les règles du LayoutManager que tu emploes :
    - le système de contraintes qui lui est associé (pour le BorderLayout, que signifier CENTER, EAST, NORTH, etc...)
    - les données des composants layoutés qu'exploite le LayoutManager (la taille maxi, mini, préférentielle)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/06/2014, 21h35
  2. Mise en page qui s'adapte à la fenêtre
    Par twisel dans le forum Mise en page CSS
    Réponses: 25
    Dernier message: 14/08/2013, 13h19
  3. [Débutant] Adaptation de fenêtre
    Par Mercusyo dans le forum C++Builder
    Réponses: 4
    Dernier message: 25/01/2013, 11h19
  4. [XL-2007] Adapter une fenêtre FileSearch
    Par arnaudTHE dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 08/01/2013, 09h45
  5. Réponses: 4
    Dernier message: 20/01/2010, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo