Partage
  • Partager sur Facebook
  • Partager sur Twitter

repaint JScrollPane

    22 novembre 2010 à 0:32:35

    Bonjour,
    Dans le cadre d'un projet, je dois créer une application permettant d'afficher une matrice textuelle sous la forme d'un graphe.
    J'ai un problème lors du défilement du scroll. Le repaint ne s'effectue pas.

    Voici mon code.
    package vue;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.util.LinkedList;
    
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    
    import Outils.Constante;
    
    import modele.Phrase;
    import modele.Relation;
    
    public class PanneauGraphe extends JPanel {
    
    	private GrapheTextuel graphe;
    	private JScrollPane scroll;
    	private BorderLayout border;
    	private LinkedList<Phrase> listePhrase;
    	private LinkedList<Relation> listeRelation;
    	
    	public PanneauGraphe(LinkedList<Phrase> listePhrase, LinkedList<Relation> listeRelation){
    		super();
    		this.listePhrase=listePhrase;
    		this.listeRelation=listeRelation;
    		border=new BorderLayout();
    		setLayout(border);
    		setPreferredSize(new Dimension(Constante.LARGEUR, Constante.HAUTEUR));
    		setBackground(Color.white);
    		graphe=new GrapheTextuel(listePhrase,listeRelation);
    		scroll=new JScrollPane(graphe);
    		add(scroll, border.CENTER);
    		scroll.setPreferredSize(new Dimension(1000, 700));
    		scroll.setBackground(Color.white);
    		scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    		scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
    	}
    }
    

    package vue;
    
    import java.awt.BasicStroke;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.util.Hashtable;
    import java.util.LinkedList;
    
    import javax.swing.JPanel;
    
    import modele.Phrase;
    import modele.Relation;
    
    public class GrapheTextuel extends JPanel{
    		
    		private Noeud noeud;
    		private Arete arete;
    		private int nombreNoeud=1, cpt=0;
    		private int x=20,y=30*nombreNoeud-10;
    		private LinkedList<Noeud> listeNoeud;
    		private LinkedList<Arete> listeArete;
    		private Point cible=new Point(0,0), source=new Point(0,0);
    		private Point[] points;
    		
    	public GrapheTextuel(LinkedList<Phrase> listePhrase, LinkedList<Relation> listeRelation){
    		super();
    		listeNoeud=new LinkedList<Noeud>();
    		listeArete=new LinkedList<Arete>();
    		points=new Point[listePhrase.size()+1];
    		setPreferredSize(new Dimension(1000, 1000));
    		for (Phrase p:listePhrase){
    			noeud=new Noeud(p, x, y, nombreNoeud);
    			listeNoeud.add(noeud);
    			nombreNoeud++;
    			y=70*nombreNoeud-50;
    			points[nombreNoeud-1]=new Point(x,y);
    		}
    		for(Relation r : listeRelation){
    			for(Noeud noeud:listeNoeud){
    				System.out.println(noeud.getPhrase().getId());
    				if(r.getIdSource().equals(noeud.getPhrase().getId()))
    					source=new Point(noeud.getX(),noeud.getY());
    				System.out.println(source.getY());
    				if(r.getIdCible().equals(noeud.getPhrase().getId()))
    					cible=new Point(noeud.getX(),noeud.getY());
    			}
    			if(cpt%2!=0){
    				source.x=880;
    				cible.x=880;
    			}
    			else {
    				source.x=20;
    				cible.x=20;
    			}
    			arete=new Arete(r, source, cible);
    			listeArete.add(arete);
    			cpt++;
    		}
    	}
    	
    	public void paintComponent(Graphics g){
    		for (Noeud noeud: listeNoeud){
    			if(noeud!=null)
    				noeud.dessinerNoeudTextuel(g);
    		}
    		for(Arete arete: listeArete){
    			arete.dessinerArete(g);
    		}
    	}
    	
    	public void setArete(Arete arete) {
    		this.arete = arete;
    	}
    	
    	public Arete getArete() {
    		return arete;
    	}
    		
    	/*private void zoom(Graphics g){
    			
    	}*/
    }
    


    et les méthodes dessine

    public void dessinerArete(Graphics g){
    		Graphics2D g2d = (Graphics2D) g;
    		g2d.addRenderingHints(AALIAS);
    		g2d.setStroke(new BasicStroke(3));
    		g.setFont(new Font("Arial", 15, 15));
    		String chaine = new String(relation.getTags());
    		g2d.setColor(Color.blue);
    		g2d.drawOval(source.x-15,(source.y+15+cible.y+15)/2-30, 100, 60);
    		if(source.x==20){
    			g2d.drawLine(source.x+50, (source.y+cible.y+30)/2-30, source.x+115, source.y+15);
    			g2d.drawLine(cible.x+50, (source.y+cible.y+30)/2+30, cible.x+115, cible.y+15);
    		}
    		else {
    			g2d.drawLine(source.x+50, (source.y+cible.y+30)/2-30, source.x-25, source.y+15);
    			g2d.drawLine(cible.x+50, (source.y+cible.y+30)/2+30, cible.x-25, cible.y+15);
    		}
    		g2d.setColor(Color.black);
    		//g2d.drawString(chaine, 30, 20);
    	}
    
    
            public void dessinerNoeudTextuel(Graphics g){
    		Graphics2D g2d = (Graphics2D) g;
    		g2d.addRenderingHints(AALIAS);
    		g2d.setStroke(new BasicStroke(3));
    		g.setFont(new Font("Arial", 15, 15));
    		String chaine = new String("   "+nombreNoeud+" .   "+phrase.getPhrase());
    		g2d.setColor(Color.black);
    		g2d.drawRoundRect(x+115, y, x+700, y2, 15, 15);
    		g2d.drawString(chaine, x + 165, y+20);
    	}
    


    • Partager sur Facebook
    • Partager sur Twitter
      22 novembre 2010 à 13:32:36

      Ce que tu peux faire c'est mettre un adjusmentListener sur les scrollbar sur JScrollPane, et de repaint le contenu du JScrollPane lorsque tu bouges une des deux scrollbars
      • Partager sur Facebook
      • Partager sur Twitter
        22 novembre 2010 à 17:23:34

        Merci d'avoir répondu.
        J'ai réussi, après quelques recherches, à trouver une solution.
        J'ai ajouté la ligne
        super.paintComponent(g);
        

        dans la méthode paintComponent() de la classe GrapheTextuel.
        • Partager sur Facebook
        • Partager sur Twitter

        repaint JScrollPane

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown