2009-09-06 9 views
1

Je suis en difficulté (!) Avec le développement de l'interface graphique Java. Toutes ces petites choses qui ont un sens évident ne fonctionnent pas. Je vais vous expliquer ce que j'essaie de faire et où j'échoue (c'est assez frustrant):La valeur de setPreferredSize de Java ne sera pas redimensionnée JPanel

J'ai cet objet graphics2d qui réside dans un panneau. Maintenant, ce graphisme dessine une image, il peut continuer et dessiner pour toujours. ce dessin se développe horrioncally et puisque je ne sais pas quelle taille s'attendre je l'ai mis dans un scrollpane. Maintenant, je veux redimensionner le JPanel dans chaque itération de la douleur et mettre la valeur setPreferredSize à une plus grande valeur, en élargissant ainsi le bouton du scrollpane.

Le problème: Pour une raison quelconque, lorsque j'appelle setPreferredSize à partir de paint, il ne fait rien. Je l'appelle sur le panneau. Lorsque j'essaie d'appeler setPreferredSize à partir de la fonction qui appelle paint, il n'effectue l'opération de redimensionnement qu'une seule fois!

Quelle pourrait être la raison de cela? En dehors de cela j'ai une autre petite question, j'aimerais résoudre: Depuis le dessin graphique continue et augmente en taille dans le temps, comment puis-je avancer la position des scrollpanes? Progressivement l'augmenter?

Les gens, merci beaucoup. J'ai vraiment besoin d'aide ici

Répondre

6

preffered est la taille, par son nom, pas obligatoire ... Pack peut-être() ou revalider() contribuerait ...

+0

wow, revalidate a vraiment fait l'affaire: O merci 'comme'. C'est comme chercher une aiguille dans une botte de foin. Savez-vous comment faire avancer la barre de défilement si? – vondip

+0

Pourquoi posez-vous une question à plusieurs sur ce sujet. Vous avez reçu la réponse dans vos autres messages, mais vous ne prenez jamais la peine de marquer les questions comme acceptées. Bien sûr, vous ne devriez jamais appeler setPreferredSize de la méthode paintComponent(). Et vous ne devriez pas appeler revalidate à partir de cette méthode non plus. Si vous posiez toutes vos questions ensemble, tout le monde saurait ce qui a été suggéré et nous ne perdrions pas de temps à faire les mêmes suggestions. Dans l'avenir, postez un SSCCE avec votre question. Si vous ne savez pas ce qu'est un SSCCE, alors cherchez sur le web. – camickr

+0

@unknown: essayez de faire défiler l'élément dans un thread séparé, peut-être vous avez un scénario dans lequel vous définissez quelque chose alors que le processus de validation n'est pas encore terminé, et ce processus revient à 0. Pas sûr que cela aiderait .. –

2

Cela me semble que vous avez eu quelques problèmes.

  • Définition d'un attribut de taille (actuallly tout attribut d'un composant du tout) à l'intérieur de la méthode de peinture se traduira par un comportement peut-être étrange, parce que vous ne savez pas vraiment quand et comment la peinture souvent est appelée

  • Normalement, vous n'appelez pas vous-même peinture. Il sera appelé par Swing lui-même, une fois que le composant devient visible

  • Si je l'ai bien, vous voulez avoir un composant, qui grandit avec le temps. À mon humble avis l'approche correcte serait de créer un minuteur. En utilisant le minuteur, changez la taille selon les besoins. Dans la méthode de peinture il suffit de lire cette information et de l'utiliser pour décider quoi peindre.

+0

Bien, j'ai déjà une minuterie qui appelle la méthode repaint de temps en temps. J'ai essayé de régler la taille du composant moi-même et j'ai remarqué cette chose étrange: Lorsque la barre de défilement est déplacée à l'extrémité distante (comme si je vais faire défiler vers le haut) le JPanel se redimensionne soudainement. Des idées pourquoi? Et comment puis-je faire avancer le volet de défilement? – vondip

+0

Il semble que vous ayez besoin d'informer les composants amont (JScrollpane) de la modification. Si je l'ai bien fait, invalider() est la bonne chose à faire, mais je ne suis pas complètement sûr –

1

setPreferredSize est l'un des nombreux conseils que vous pouvez donner à la LayoutManager qui gère la disposition du conteneur de votre composant si un LayoutManager a bien été défini. Il appartient au LayoutManager donné de faire ce qu'il fait avec ces indices.

Je vous suggère de consulter le livre Filthy Rich Clients pour une explication détaillée du fonctionnement du rendu du composant Swing.

1

Vous devriez noter que set (Preferred/Minimal/Maximum) Size() n'est rien d'autre que des indications pour le composant parent et son gestionnaire de mise en page sur l'espace que le composant devrait avoir. Notez en outre que ces tailles ne sont interprétées que lorsque les composants sont mis en page (lors du premier rendu, invalidate() et ainsi de suite).

Questions connexes