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

AWT/Swing Java Discussion :

JScrollPane problème d'affichage


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 42
    Points : 33
    Points
    33
    Par défaut JScrollPane problème d'affichage
    Bonjour à tous,
    dans un une classe qui extends une JTable je construit une JTable dans laquelle je dessine des rectangles dedans. Ensuite, je créé une JScrollPane sur cette JTable, le problème c'est que la barre horizontal de ma JScrollPane n'apparaît pas qd des rectangles dépasse de la surface...

    Code de ma class construisant ma JTable et dessinant les rectangles:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    public class TableHeure extends JTable {
    //	contient tous les rectangles qui dessine un evenement
    	private Rectangle[] tousRectangle;
    	private LinkedList list;    //contient tous les evenements du jour
    	private JPopupMenu menu;    //menu deroulant lors d'un clique droit
    	private JMenuItem details;  //action possible sur un evenement
    	private JMenuItem modifier; //action possible sur un evenement
    	private JMenuItem supprimer;//action possible sur un evenement
    	private TableHeure jtable;  //utilise lorsque l'ecouteur se met en route
    	/**
             * Constructeur. En premier lieu il construit la JTable
             * @param t
             * @param s
             * @param date a laquelle on devra cree cette JTable
             */
    	public TableHeure(Object[][] t,String[] s,MaDate date) {
    		super(t,s); //cree la JTable
    		jtable = this;
    		addMouseListener(getMouseListener()); //ajout un ecouteur a cet objet
    		list = new ActionEvents().getEvents(date);
     
    		//test si la liste est vide on stoppe
    		if( list == null)
    			return;
     
    		tousRectangle = new Rectangle[list.size()];
    		//format utilise
    		SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy HH'h'mm ");
    		Date DDebutPrec = null;  //utilise dans le "for"
    		Date DFinPrec = null;    //utilise dans le "for"
    		int decalage = 30;       //coin superieur gauche du rectangle
     
    		//on construit les rectangles
    		for(int i = 0; i < list.size();i++) {
    			Date DDebut = null;
    			Date DFin = null;
    			try {
    				DDebut = format.parse(((Events)list.get(i)).getDateDebut());
    				DFin = format.parse(((Events)list.get(i)).getDateFin());
    			} catch (ParseException e1) {
    				e1.printStackTrace();
    			}
     
    			/**
                             * On test en regardant si l'evenement precedent n'est pas a cheval
                             * sur l'evenement i. Si tel est le cas, on decale sa position. 
                             * On ne peut que regarder le precedent car les evenements sont tries
                             */
    			if (DDebutPrec != null && ( 
    			  (DDebut.compareTo(DDebutPrec) >= 0 && DDebut.compareTo(DFinPrec) <=0) ||
    			  (DFin.compareTo(DDebutPrec) >= 0 && DFin.compareTo(DFinPrec) <=0))) {
    				decalage+=95;
    			}
    			//"nbrMinute" sert a placer correctement dans notre JTable
    			int nbrMinutes = DDebut.getHours() * 60 + DDebut.getMinutes();
    			int hauteur = DFin.getHours() * 60 + DFin.getMinutes();
    			tousRectangle[i] = 
    				new Rectangle(decalage,nbrMinutes/3 ,93,(hauteur-nbrMinutes)/3);
    			        //"nbrMinutes/3" on divise en 3 pour respecter l'echelle de
    					// notre JTable.Ainsi le dessin correspondra aux heures.
    			DDebutPrec = DDebut;
    			DFinPrec = DFin;
    		}
     
    		//construction de notre Menu deroulant
    		menu = new JPopupMenu();
    		details = new JMenuItem("Details");
    		supprimer = new JMenuItem("Supprimer");
    		modifier = new JMenuItem("Modifier");
    		menu.add(details);
    		menu.add(supprimer);
    		menu.add(modifier);
    	}
     
    	public void paint(Graphics g) {
    	     super.paint(g);
    	     //on teste si il y a des evenements
    	     if (tousRectangle == null)
    	    	 return;
     
    	     //on dessine les rectangles
    	     for(int i = 0; i < tousRectangle.length;i++) {
    	    	 g.setColor(Color.LIGHT_GRAY);
    		     g.fill3DRect(tousRectangle[i].x,tousRectangle[i].y,
    		    		 tousRectangle[i].width,tousRectangle[i].height, true);
    			 g.setColor(Color.black);
    			 String sujet = ((Events)list.get(i)).getInfo()[0]; //contient le sujet
    			 g.drawString(sujet, tousRectangle[i].x + 5, tousRectangle[i].y + 12);
    	     }
    		}
    le bout de code dans l'autre class qui me créé ma JScrollPane:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    listeHeures = new TableHeure(tableauObject,titre,date);
    		//construit une scrollpanne et l'ajout au panel
    		scrollPane = new JScrollPane(listeHeures);
    		scrollPane.setPreferredSize(new Dimension(230,350));
    		this.add(scrollPane);
    Voila un aperçu du programme, regarder la barre horizontal n'apparaît pas:
    Images attachées Images attachées  

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    LE problème vient du fait que tu fais des opérations de dessin sur ta JTable et que ces opérations ne modifient pas la preferredSIze de la JTable. donc au moment ou tu redessine il faut recalculer ta taille de ta table (grosso modo si position horizontale du rectangle+largeur de ton rectangle > largeur de ta table tu fais en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setPreferredSize(new Dimension(position horizontale du rectangle+largeur rectangle, position verticale du rectangle+ hauteur du rectangle))
    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.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 42
    Points : 33
    Points
    33
    Par défaut
    j'ai fait dans ma classe qui extends la JTable à la fin du constructeur ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.setPreferredSize(new Dimension(400,400));
    		this.validate();
    et même la, il n'y a aucune barre horizontal qui s'affiche... OU n'est-ce pas là que je dois le faire?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Points : 69
    Points
    69
    Par défaut
    Si j'ai bien compris il faut que tu utilises la variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS
    quand tu créés le JScrollPane.

  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 : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Pas vraiment, il verra la scrollbar mais celle ci ne sera pas scrollable car la taille de la JTable ne sera pas supérieure à celle de JScrollPanel
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 42
    Points : 33
    Points
    33
    Par défaut
    je fais quoi en bref? Je vois pas comment dans ma JTable je peux recalculer sa tille en faite... si vous saviez m'éclairer

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    Bonjour, en fait ce que Sinok a écrit me semble bon...
    Citation Envoyé par sinok
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setPreferredSize(new Dimension(position horizontale du rectangle+largeur rectangle, position verticale du rectangle+ hauteur du rectangle))
    c'est a dire que quand tu ajoute un rectangle tu verifie qu'il est bien contenu entierement dans ta JTable, si il ne l'est pas alors tu agrandi ta JTable de facon à ce que tous ces points ((x, y), (x+ width,y), (x+ width,y + height), et (x,y + heigh)) soient bien contenue dans ta JTable.
    normalement ta nouvelle dimension de JTable devrait être surperieur à celle de ton Panel la contenant, et donc le scrollBar devrait s'afficher...
    pour vérifier ceci met des System.out.println(jtable.getSize()+"-"+panel.getSize())...

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/06/2008, 10h33
  2. Problème d'affichage dans un JSCrollPane
    Par franklin626 dans le forum Composants
    Réponses: 2
    Dernier message: 24/04/2008, 11h44
  3. JScrollPane : problème d'affichage
    Par Gaaston dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 28/01/2008, 19h25
  4. [Swing] Problème d'affichage dans un JScrollPane
    Par Adrien22 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 05/04/2006, 14h36
  5. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43

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