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

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

Marsh Posté le 20-04-2005 à 10:25:20    

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
Reply

Marsh Posté le 20-04-2005 à 10:25:20   

Reply

Marsh Posté le 20-04-2005 à 17:02:46    


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
 

Reply

Marsh Posté le 21-04-2005 à 10:08:50    

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
Reply

Marsh Posté le 21-04-2005 à 12:07:29    


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

Reply

Marsh Posté le 21-04-2005 à 17:31:50    

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?

Reply

Marsh Posté le 22-04-2005 à 17:53:54    

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

Reply

Marsh Posté le 22-04-2005 à 23:39:26    

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
Reply

Marsh Posté le 25-04-2005 à 15:36:04    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed