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 :

Paint pas fait sur JTextPane+JScrollPane


Sujet :

AWT/Swing Java

  1. #1
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Par défaut Paint pas fait sur JTextPane+JScrollPane
    Bonjour,

    Je dessine une forme rectangulaire, dans un objet qui hérite de DefaultHighlightPainter et que j'attribue a un JTextPane. Cela sert à mettre en évidence des informations.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public Shape paintLayer(Graphics g, int offs0, int offs1, Shape bounds, JTextComponent c, View view) {
         g.drawRect(...);
    }
    Le JTextPane est plus grand que la JFrame et est encapsulé dans un JScrollPane.
    Lorsque mon Highlight est peint, il est seulement peint sur la partie visible à l'écran du JTextPane, mais pas sur la partie caché : lorsque je scroll horizontalement, il n'y a pas de dessin, alors que cela est dessiné de manière certaine dans paintLayer().

    J'ai implementé un listener sur le scroll et ainsi pu actualiser paintLayer() mais il y a un temps d'affichage beaucoup trop lent (je veux dire que cela se voit), cela n'est pas satisfaisant.

    Comment se fait-il que le dessin ne se fasse que sur la partie visible ? Comment puis-je faire pour palier à cela ?
    La moindre information est la bienvenue, car ... je pige pas

  2. #2
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Par défaut
    Voila un exemple.

    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
    import java.awt.Color;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTextPane;
     
    public class GoSc {
    	public static void main(String a[]) {
    		final JFrame frame = new JFrame();
    		frame.setSize(300, 200);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		JTextPane editor = new JTextPane() {
    			@Override
    			public boolean getScrollableTracksViewportWidth() {
    				return false;
    			}
    		};
    		editor.setText("mmmmmmmmm\nmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm");
    		frame.setContentPane(new JScrollPane(editor));
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    		LineHighlight line = new LineHighlight(editor, Color.YELLOW);
     
    		line.resetLineHighlight();
    	}
    }
    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
    91
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    import java.awt.Shape;
    import javax.swing.SwingUtilities;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.DefaultHighlighter;
    import javax.swing.text.Element;
    import javax.swing.text.Highlighter;
    import javax.swing.text.JTextComponent;
    import javax.swing.text.View;
    import javax.swing.text.DefaultHighlighter.DefaultHighlightPainter;
     
    public class LineHighlight extends DefaultHighlightPainter {
     
    	private JTextComponent theTextComponent = null;
    	private Highlighter theHighlighter = null;
    	private Object theLastHighlight = null;
    	private static Color defaultColor = new Color(230,245,255);
            private boolean active = true;
     
    	public LineHighlight(JTextComponent aTextComponent, Color lineHighlightColor) {
    		super(lineHighlightColor == null ? defaultColor : lineHighlightColor);
    		if (aTextComponent != null) setTextComponent(aTextComponent);
    	}
     
    	private void setTextComponent(JTextComponent aTextComponent) {
    		theTextComponent = aTextComponent;
    		DefaultHighlighter defaultHighlighter = (DefaultHighlighter)theTextComponent.getHighlighter();
    		defaultHighlighter.setDrawsLayeredHighlights(true);
    		theHighlighter = defaultHighlighter;
    	}
     
     
    	@Override
    	public Shape paintLayer(Graphics g, int offs0, int offs1, Shape bounds, JTextComponent c, View view) {
    		if (active) {	
    			try {
    				Rectangle r = c.modelToView(offs0);
    				r.width = c.getSize().width;
    				g.setColor(getColor());
    				g.fillRect(r.x, r.y, r.width, r.height);			
    				//c.repaint(r.x, r.y, r.width, r.height);
    				return r;
    			} 
    			catch (BadLocationException e) {
    				e.printStackTrace();
    			}
    		}
    		return null;
    	}
     
    	public void resetLineHighlight() {
    		if (theTextComponent != null && active) {
    			SwingUtilities.invokeLater(new Runnable() {
    				public void run() {
    					if (theLastHighlight != null) theHighlighter.removeHighlight(theLastHighlight);
    					Element root = theTextComponent.getDocument().getDefaultRootElement();
    					int line = root.getElementIndex(theTextComponent.getCaretPosition());
    					Element lineElement = root.getElement(line);
    					int start = lineElement.getStartOffset();
    					int end = lineElement.getEndOffset();
    					addHighlight(start, end);
    				}
    			});
    		}
    	}
     
    	private void addHighlight(int offset, int end) {
    		try {
    			theLastHighlight = theHighlighter.addHighlight(offset, end, this);
    		} 
    		catch (BadLocationException ble) {
    			ble.printStackTrace();
    		}
    	}
     
    	protected void removeHighlight() {
    		theHighlighter.removeHighlight(theLastHighlight);
    	}
     
    	public boolean isActive() {
    		return active;
    	}
     
    	public void setActive(boolean active) {
    		this.active = active;
    		theTextComponent.repaint();
    	}
     
    }

Discussions similaires

  1. SVN ne voit pas les modifications faites sur mes fichiers
    Par LGnord dans le forum Subversion
    Réponses: 1
    Dernier message: 03/05/2011, 15h36
  2. Réponses: 2
    Dernier message: 15/04/2009, 15h38
  3. un point sur les pointeurs (pas fait exprés)
    Par yorukaze dans le forum Débuter
    Réponses: 17
    Dernier message: 22/01/2008, 01h00
  4. [JScrollPane][paint] pas de repaint
    Par wonderyan dans le forum AWT/Swing
    Réponses: 15
    Dernier message: 17/01/2006, 11h37
  5. Réponses: 27
    Dernier message: 25/08/2004, 22h30

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