2010-08-10 11 views
0

J'ai un menu contextuel qui affiche dynamiquement les objets JPanel créés dans un JPanel dans un JScrollPane. Le menu contextuel affiche des recommandations à l'utilisateur et l'élément le plus élevé est la recommandation la plus pertinente. J'utilise JPopupMenu pour afficher la fenêtre:JScrollPane dans une fenêtre contextuelle ne défile pas par programmation

JPanelTemplatePopup jptep = new JPanelTemplatePopup(); 
JPopupMenu popup = new JPopupMenu(); 
popup.add(jptep); 
popup.show(this, 500, 100); 

Le problème est, je ne peux pas faire défiler JScrollPane à l'élément le plus élevé pour l'afficher en premier. Je l'ai essayé.

  • .getViewPort() setViewPosition (nouveau Point (0,0));
  • .scrollRectToVisible (firstelement.getBounds());

avant et après validate() s. Peu importe ce que je fais, quand la fenêtre apparaît, le volet de défilement reste toujours au même endroit.

J'ai même suspecté que les opérations qui ont eu lieu avant d'afficher la fenêtre ont été ignorées, donc j'ai créé et appelé une méthode publique de la classe pour faire défiler la fenêtre après qu'elle soit affichée. Rien n'a changé.

S'il vous plaît aider,

Emre

+0

Je pense qu'il est similaire à une condition de course. La barre de défilement doit être mise à jour * après l'affichage de la fenêtre contextuelle. Je pense que j'ai besoin de trouver une sorte d'écouteur qui déclenche une action quand la popup est * complètement * affichée. – Emre

Répondre

0

Ouais, eh bien, trouvé une solution pour cela.

J'ai réduit le problème à un JEditorPane qui se trouvait dans les objets JPanel personnalisés. Son contenu a été mis à jour dynamiquement par le programme. Lors de la génération des objets, je réglais le contenu de JEditorPanes par leurs méthodes setText. La mise à jour de la position du curseur en réglant le texte sur une chaîne a forcé le volet de défilement à défiler ci-dessous.

Je viens de cela au inséré constructeur et le problème a été résolu:

DefaultCaret caret = (DefaultCaret) jEditorPaneContents.getCaret(); 
caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE);