2009-02-24 8 views
2

Je suis nouveau sur Java, donc c'est probablement assez simple, mais je ne suis pas sûr de savoir comment le faire fonctionner.Comment puis-je faire en sorte qu'un JPanel se mette à jour une fois que la fenêtre défile?

Fondamentalement, j'ai une classe que j'utilise pour dessiner une grille, qui étend JPanel. J'ai mis cette classe dans une fenêtre, à l'intérieur d'un JScrollPane. Le défilement fonctionne comme je le souhaite, sauf que le dessin dans ma classe ne se met pas à jour une fois que la fenêtre défile. Il met à jour si la fenêtre est redimensionnée cependant. Je pense que je suis supposé utiliser des événements/auditeurs ou quelque chose comme ça, mais je ne suis pas sûr de savoir par où commencer.

éditer: aussi, quand j'ouvre l'un des menus et qu'il se chevauche sur le dessin, la région qui était couverte par les menus n'est pas mise à jour.

Bon, essayons à nouveau: J'ai une classe appelée draw. Ensuite, j'ai un GridBagLayout hors des tirages. Cela crée la grille dont j'ai besoin. J'ai un objet qui se déplace autour de la grille, donc je peux mettre à jour la grille sans avoir à calculer moi-même les rectangles qui doivent être mis à jour.

Ensuite, cette grille se trouve dans un JScrollPane, qui n'est pas sous-classé. J'utilise pack() quand je crée ma fenêtre, mais la chose est, la fenêtre peut être plus grande que la résolution le permet, j'ai donc besoin d'être scrollable. Le défilement fonctionne pour moi, mais il ne met pas à jour l'image quand je l'utilise. Cependant, le redimensionnement de la fenêtre le met à jour.

Ce que je veux est un moyen de redessiner toute ma fenêtre lorsque je clique sur le JScrollPane. Et maintenant, j'ai aussi besoin de redessiner l'ensemble (ou certaines parties, je le verrai plus tard) une fois que j'aurai accédé aux menus, car les parties dessinées de la grille sous les menus ne sont pas mises à jour.

C'est la meilleure façon de le décrire.

Répondre

0

Vous devez probablement spécifier la taille minimale.

Vous ne postez pas de code ni de capture d'écran, il est donc difficile de l'examiner.

Essayez de lire les commentaires à ce sujet, il semble similaire

JScrollPane now showing its viewport

-1

Il a été un moment que je l'ai fait des graphiques dans Swing, mais je pense que le code que vous cherchez est quelque chose comme:

Graphics g = getGraphics(); 
if (g != null) paintComponent(g); 
else repaint(); 

Et comme vous l'avez dit, vous aurez besoin d'ajouter ce code dans un écouteur attaché aux fonctions de défilement du JPanel.

Je créerais probablement un canevas qui contiendrait le dessin entier et le placerais dans un JScrollPane. Cela permettra à Java de faire tout le travail!

1

Il suffit d'ajouter un écouteur pour en faisant défiler viewport modifier les événements et émettre un repeindre(). Je pense que je déconseillerais la réponse de Steve Moyer, car la peinture ne devrait être faite que dans le cadre d'un événement de peinture. Et si le composant défilant est assez grand, vous devriez juste repeindre la partie de votre JPanel qui est visible dans le composant viewport (votre JScrollPane).


Modifier

pour suivre le mouvement de la fenêtre, utiliser JScrollPane getViewport() et JViewport addChangeListener(). Utilisez ensuite les méthodes de JViewport pour identifier la partie de la vue qui est visible lors de la détermination de la zone à peindre dans la méthode de peinture. Notez que ceci devrait être une optimisation appliquée seulement après que la peinture fonctionne correctement en repeignant la vue entière dans chaque événement de peinture.

+0

Comment puis-je savoir ce qui est actuellement visible? –

+0

Voir la réponse élargie –

+0

Je savais qu'il devait y avoir un meilleur moyen que ma méthode! J'ai enlevé ma réponse en faveur de la tienne :) – coobird

0

Est-ce que vous faites par hasard la peinture de votre "draw" en dehors des méthodes paint() ou paintComponent()? Si c'est le cas, vous devez déplacer votre code de peinture dans paintComponent().

1

On dirait que vous voulez faire quelque chose comme ceci:

final JScrollPane pane = new JScrollPane(); 
    pane.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseClicked(MouseEvent e) { 
      pane.revalidate(); 
     } 
    }); 

Il est peut-être un peu exagéré, mais chaque fois que vous cliquez sur le panneau de défilement, il va tenter de repeindre tous les composants dans la hiérarchie ce qui devrait être similaire à quand vous redimensionnez l'écran.

0

assurez-vous que le panneau le tout support est défini comme viewportview de votre panneau de défilement (JScrollPane.setViewportView)

Questions connexes