Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2578 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  JScrollBar: mais tu va demarrer en haut , oui!!!![resolu]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

JScrollBar: mais tu va demarrer en haut , oui!!!![resolu]

n°1053221
le_moustiq
Posté le 20-04-2005 à 10:25:20  profilanswer
 

Il y a deja des messages du meme genre mais rien de satisfaisant.
 
J'ai un JScrollBar sur un panel qui ne veut pas demarrer en haut
mon JScrollBar est tout en bas a l initialisationde moin JFrame(ou presque tout en bas).
J'ai remarqué que la JScrollBar se met en face du dernier JTextArea inclue à l'intérieur. Moi je veux une JScrollBar tout en haut de mon Panel(le panel est le component du JScollBar)
J'ai essayé un setValue un updateUI ca a rien changé du tout.
help me please


Message édité par le_moustiq le 25-04-2005 à 15:40:07
mood
Publicité
Posté le 20-04-2005 à 10:25:20  profilanswer
 

n°1053912
Nicolas_75
Posté le 20-04-2005 à 17:02:46  profilanswer
 


Bonjour,
 
Je ne suis pas sûr de bien comprendre.  
 
1. Si le JScrollPane ne contient qu'un seul JTextArea, ne suffit-il pas de placer le curseur en haut de la zone de texte par un :

Code :
  1. monJTextArea.setCaretPosition(0);


?
 
2. Si la barre de défilement est associée à un JPanel contenant plusieurs JTextArea, setValue semble la bonne solution. Le code ci-dessous fonctionne chez moi, et permet de placer la barre de défilement à la position souhaitée.
 
 

Code :
  1. // appeler le ficier MonTest3
  2. import java.awt.*;
  3. import javax.swing.*;
  4. public class MonTest3 {
  5.    
  6.     public static void main(String[] args) {
  7.        
  8.         // initialisation de la frame :
  9.         JFrame maFrame = new JFrame();
  10.         maFrame.setResizable(false);
  11.         maFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  12.        
  13.         // on veut qu'elle prenne toute la place possible
  14.         Toolkit kit = Toolkit.getDefaultToolkit();
  15.         Insets insets = kit.getScreenInsets(maFrame.getGraphicsConfiguration());
  16.         Dimension screen = kit.getScreenSize();
  17.         maFrame.setSize((int)(screen.getWidth()-insets.left-insets.right), (int)(screen.getHeight()-insets.top-insets.bottom));
  18.         maFrame.setLocation((int)(insets.left), (int)(insets.top));
  19.        
  20.         // affichage de la frame
  21.         maFrame.setVisible(true);
  22.        
  23.         // container de la frame
  24.         JPanel bigPanel = new JPanel();
  25.         bigPanel.setLayout(new BorderLayout());
  26.         maFrame.setContentPane(bigPanel);
  27.        
  28.         // une boîte verticale englobée dans un JScrollPane, destinée à recevoir des JTextArea :
  29.         JPanel verticalBoxPanel = new JPanel();
  30.         verticalBoxPanel.setLayout(new BoxLayout(verticalBoxPanel, BoxLayout.Y_AXIS));
  31.         JScrollPane scroll = new JScrollPane(verticalBoxPanel);
  32.         bigPanel.add(scroll);
  33.        
  34.         // on rajoute des JTextArea :
  35.         JTextArea area;
  36.         double position = 0.5; // POSITION DE LA BARRE DE DEFILEMENT (ENTRE 0 et 1)
  37.         int nbDeJTextArea = 100;
  38.         for (int i=0; i<nbDeJTextArea; i++) {
  39.             area = new JTextArea("JTextArea "+i+" sur "+nbDeJTextArea);
  40.             verticalBoxPanel.add(area);
  41.             JScrollBar jsb = scroll.getVerticalScrollBar();
  42.             jsb.setValue((int) (jsb.getMinimum()+(jsb.getMaximum()-jsb.getMinimum())*position));
  43.             bigPanel.revalidate();
  44.             try {Thread.sleep(50);} catch (Exception e) {e.printStackTrace();}
  45.         }
  46.     }
  47. }


 
En espérant que cela puisse aider,
 
Nicolas
 

n°1054851
le_moustiq
Posté le 21-04-2005 à 10:08:50  profilanswer
 

Bon je te promet le setValue me fait rien. Est-ce que c est parce que j'ajoute mon scroll dans un container en non dans un panel.
Je te met une partie de mon code car il est trop gros

Code :
  1. panel.removeAll();
  2.  GridBagLayout gridbag = new GridBagLayout();
  3.  GridBagConstraints c = new GridBagConstraints();
  4.  panel.setLayout(gridbag);
  5.                 c.fill = GridBagConstraints.BOTH;
  6.                 c.weightx = 1.0;
  7.  c.gridwidth = GridBagConstraints.REMAINDER;
  8.  for(int i = 0; i<panels.size(); i++){
  9.   JPanel p = (JPanel) panels.get(i);
  10.   gridbag.setConstraints(p, c);
  11.   c.weightx = 0.0;
  12.   panel.add(p);
  13.  }
  14.  JButton ok = new JButton("Ok" );
  15.  ok.setToolTipText("Cliquer sur ce bouton pour générer la feuille de style XSL!" );
  16.  ok.setBackground(Color.cyan);
  17.  ok.addActionListener(this);
  18.  JButton annuler = new JButton("Annuler" );
  19.  annuler.setToolTipText("Quitter cette MACRO!" );
  20.  annuler.setBackground(Color.pink);
  21.  annuler.addActionListener(this);
  22.  JPanel boutons = new JPanel();
  23.  boutons.add(ok);
  24.  boutons.add(annuler);
  25.  panel.add(boutons);
  26.  JScrollPane scrollPane = new JScrollPane(panel);
  27.  scrollPane.getVerticalScrollBar().setUnitIncrement(10);
  28.  JScrollBar jsb = scrollPane.getVerticalScrollBar();
  29.  jsb.setValue(jsb.getMinimum());
  30.  container.add(scrollPane, BorderLayout.CENTER);
  31.  panel.repaint();
  32.  container.repaint();
  33.  panel.updateUI();


 
Tous les repaint et update de la fin sont du au test pour l affichage.
Je suis dans une classe qui extend JFrame, container est le getContentPane de ce JFrame
panels est un vecteur de panels contenant eux memes entre autre des JTextArea
 
J'ai remarqué par pur hazard que si, avant l'affichage de ma JFrame, je fais

Code :
  1. JOptionPane.showMessageDialog(this,"" );


alors la elle arrive à démarrer en haut, je ne comprend pas... malheureusement je n'ai pas de message à afficher à cet endroit :-(


Message édité par le_moustiq le 21-04-2005 à 10:15:06
n°1055026
Nicolas_75
Posté le 21-04-2005 à 12:07:29  profilanswer
 


Je ne sais pas trop quoi dire. Essaie tout de même de mettre le JScrollPane dans un JPanel, affecté du layout BorderLayout, pour voir si cela change quelque chose.
 
Bon courage,
 
Nicolas

n°1055462
le_moustiq
Posté le 21-04-2005 à 17:31:50  profilanswer
 

Non ca marche pas , meme lorsque on le met ds un panel et meme avec en plus un revalidate()
 
Aurai-je découvert un bug de Java pour que personne puisse m'aider?

n°1057033
le_moustiq
Posté le 22-04-2005 à 17:53:54  profilanswer
 

Il n'y a donc personne pour m'aider?

n°1057356
Nicolas_75
Posté le 22-04-2005 à 23:39:26  profilanswer
 

Et toi, as-tu avancé dans ta réflexion ?
Dans ces cas-là, tu peux essayer de simplifier le code, en enlevant tous les éléments contenus dans la JFrame, et en rajoutant progressivement des JLabel, des panels, des barres de défilement... jusqu'à isoler le moment où le comportement n'est pas celui que tu désires, et alors résoudre le problème.
 
J'ai essayé...
Ci-dessous ton code, avec les ajouts suivants :
(1) création des éléments manquants au début
(2) le contenant du JScrollPane est un JPanel en BorderLayout
(3) revalidate et autres à la fin
 
Les modifications sont clairement indiquées.
 
Chez moi, la barre de défilement se place là où on veut (variable position).
 
Nicolas
 
 

Code :
  1. // appeler le fichier MonTest5.java
  2. import java.util.Vector;
  3. import java.awt.*;
  4. import javax.swing.*;
  5. public class MonTest5 extends JFrame {
  6.    
  7.     public MonTest5() {
  8.        
  9.         // AJOUT au code de le_moustiq : création de la JFrame
  10.         super();
  11.         this.setSize(900,500);
  12.         this.setResizable(true);
  13.         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  14.         this.setVisible(true);
  15.        
  16.         // AJOUT au code de le_moustiq : création de container : JPanel en BorderLayout
  17.         JPanel container = new JPanel();
  18.         this.setContentPane(container);
  19.         container.setLayout(new BorderLayout());
  20.        
  21.         // AJOUT au code de le_moustiq : création de panels
  22.         Vector<JPanel> panels = new Vector<JPanel>();
  23.         JPanel panelTemp;
  24.         JTextArea area;
  25.         for (int i=0; i<99; i++) {
  26.             panelTemp = new JPanel();
  27.             panelTemp.add(new JButton("bouton "+i));
  28.             area = new JTextArea();
  29.             area.setText("JTextArea "+i);
  30.             panelTemp.add(area);
  31.             panels.add(panelTemp);
  32.         }
  33.        
  34.         // AJOUT au code de le_moustiq: création de panel
  35.         JPanel panel = new JPanel();
  36.        
  37.         // CI-DESSOUS le code de le_moustiq
  38.        
  39.         panel.removeAll();
  40.        
  41.         GridBagLayout gridbag = new GridBagLayout();
  42.         GridBagConstraints c = new GridBagConstraints();
  43.         panel.setLayout(gridbag);
  44.         c.fill = GridBagConstraints.BOTH;
  45.         c.weightx = 1.0;
  46.         c.gridwidth = GridBagConstraints.REMAINDER;
  47.        
  48.         for(int i = 0; i<panels.size(); i++){
  49.             JPanel p = (JPanel) panels.get(i);
  50.             gridbag.setConstraints(p, c);
  51.             c.weightx = 0.0;
  52.             panel.add(p);
  53.         }
  54.        
  55.         JButton ok = new JButton("Ok" );
  56.         ok.setToolTipText("Cliquer sur ce bouton pour générer la feuille de style XSL!" );
  57.         ok.setBackground(Color.cyan);
  58.         //ok.addActionListener(this);
  59.         JButton annuler = new JButton("Annuler" );
  60.         annuler.setToolTipText("Quitter cette MACRO!" );
  61.         annuler.setBackground(Color.pink);
  62.         //annuler.addActionListener(this);
  63.         JPanel boutons = new JPanel();
  64.         boutons.add(ok);
  65.         boutons.add(annuler);
  66.         panel.add(boutons);
  67.        
  68.         JScrollPane scrollPane = new JScrollPane(panel);
  69.         scrollPane.getVerticalScrollBar().setUnitIncrement(10);
  70.         JScrollBar jsb = scrollPane.getVerticalScrollBar();
  71.         //jsb.setValue(jsb.getMinimum()); // VOIR PLUS BAS
  72.         container.add(scrollPane, BorderLayout.CENTER);
  73.         panel.repaint();
  74.         container.repaint();
  75.                
  76.         // AJOUT
  77.         container.revalidate();
  78.        
  79.         // AJOUT de 2 lignes, mais EN-DESSOUS du revalidate
  80.         double position = 0.66;
  81.         jsb.setValue((int) (jsb.getMinimum()+(jsb.getMaximum()-jsb.getMinimum())*position));
  82.        
  83.         panel.updateUI();
  84.     }
  85.    
  86.     public static void main(String[] args) {
  87.         MonTest5 monTest5 = new MonTest5();
  88.     }
  89.    
  90. }


Message édité par Nicolas_75 le 23-04-2005 à 15:28:54
n°1059927
le_moustiq
Posté le 25-04-2005 à 15:36:04  profilanswer
 

bon j ai reussi a trouvé pkoi ca marchait pas
J'ai fait ce que tu m'a mis mais ca marchait pas (pourtant ton test5 marchait chez moi je l ai essayé.
Tu m'a beaucoup aidé avec ton code pour que je debugue merci.
En fait j'ai trouvé mais je ne comprend pas pkoi ca faisait ca, c est un bugue de java je pense.
En realité a la fin du constructeur, j avais quelque ligne que je n avais pas mise, apres panel.updateUI(); j'avais les lignes suivantes
  getRootPane().setDefaultButton(ok);
  setBounds(200, 0, 600,600);
  setVisible(true);
  repaint();
 
et le setVisible(true); m'empechait de faire un setValue sur ma JScrollBar, va savoir pkoi charles.En le mettant a false bien sur je ne voyais plus ma frame et en le commantant , ô magie mon setValue marche.
 
Fait encore plus etrange, si je fais un setValue(true); a la fin du constructeur et que je l appelle du main de test5 comme ds l'exemple ci dessus, ca marche; par contre si je l'appelle a partir de mon autre classe(IHM.java)et que je laisse ce setValue la ca marche plus.


Message édité par le_moustiq le 25-04-2005 à 15:45:32

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  JScrollBar: mais tu va demarrer en haut , oui!!!![resolu]

 

Sujets relatifs
Style sur un Button l'aligne en bas ? [résolu][Résolu] Comment accèder à une variable d'une autre librarie ASM
Afficher une image dont le nom est enregistré dans 1 table [resolu]test création objet [Résolu]
créer un loading[résolu]passage à la ligne ds textbox[RESOLU]
[Résolu]Changement de style, cookie, pathprintf("%s") sur fonction renvoyant une chaîne [RESOLU]
[résolu] VB.NET ...Quel est ce langage ? -- RESOLU --
Plus de sujets relatifs à : JScrollBar: mais tu va demarrer en haut , oui!!!![resolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR