Écouter JFrame redimensionner les événements que l'utilisateur fait glisser la souris?
Lorsqu'un utilisateur clique sur le coin d'une JFrame pour la redimensionner et la fait glisser la souris autour de, la JFrame redessine fonction de la position actuelle de la souris que l'utilisateur fait glisser. Comment pouvez-vous écouter à ces événements?
Ci-dessous est ce que j'ai actuellement essayé:
public final class TestFrame extends JFrame {
public TestFrame() {
this.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
//This is only called when the user releases the mouse button.
System.out.println("componentResized");
}
});
}
//These methods do not appear to be called at all when a JFrame
//is being resized.
@Override
public void setSize(int width, int height) {
System.out.println("setSize");
}
@Override
public void setBounds(Rectangle r) {
System.out.println("setBounds A");
}
@Override
public void setBounds(int x, int y, int width, int height) {
System.out.println("setBounds B");
}
}
Comment puis-je déterminer et limiter la façon dont l'utilisateur redimensionne une fenêtre (basé sur les proportions de la fenêtre), car ils sont de glisser la souris autour d'?
- pouvez-vous s'il vous plaît préciser la raison de votre Générosité, parce que je vois la différence entre
Java_1.4
etJava_1.5
, mais je ne peux pas trouvé la diference pourJava_6
,note
mais sans plus profond de l'enregistrement dansNested
etInherits Method
- J'ai essayé les deux méthodes (ComponentListener sur un Composite; Remplacer valider.) Le code compile et s'exécute sous les deux versions de Java, mais dans la version 1.6 de Java la mise en page est recalculé en permanence, mais en Java 1.5 uniquement lorsque je relâchez la souris.
- êtes-vous redimensionner JComponent ou JFrame
- Je suis le redimensionnement de la JFrame avec la souris, et comme il a un
BorderLayout
le composant (avecBorderLayout.CENTER
) devraient suivre. - ComponentResizer par @camickr tips4java.wordpress.com/2009/09/13/resizing-components serait de Java5 de l'âge,
- juste à l'idée de vous essayé de retarder les événements de componentResized(ComponentEvent e) à l'aide de javax.swing.Minuterie, avis jusqu'à redimensionner se termine, vous devez Minuterie#restart(), parce que vous ne savez jamais si redimensionner extrémités, si redimensionner les extrémités, puis le feu de l'Action à partir de la Minuterie
- êtes-vous confus de cette question avec le stackoverflow.com/questions/6738664/... ? C'est exactement le problème inverse. Je veux componentResized d'être appelé en permanence, mais il ne l'est pas.
- Je pense que c'confondre façon est safiest (MsOffice, Lecteur Multimédia en attente ...de Mozilla par exemple ne pas, qui ont des problèmes avec l'Anticrénelage et le Rendu des Polices, des cercles et des Lignes au cours de redimensionner)
Vous devez vous connecter pour publier un commentaire.
Vous avez probablement besoin de remplacer quelque chose comme
validate
(n'oubliez pas d'appeler le super). Bien sûr, encore peut ne pas fonctionner si vous utilisez un système de fenêtrage pour configuré pour faire glisser les contours.Vous pouvez ajouter un composant de l'écouteur et de mettre en œuvre la componentResized fonction comme ça:
EDIT: Apparemment, pour JFrame, le componentResized événement est accroché à la mouseReleased événement. C'est pourquoi la méthode est appelée lorsque le bouton de la souris est relâché.
Un moyen d'obtenir ce que vous voulez, c'est d'ajouter un Composite qui couvrira l'ensemble de la zone de votre JFrame. Puis ajouter le componentListener pour le Composite (componentResized pour un Composite, même lorsque votre souris est toujours en le faisant glisser). Lorsque votre image est redimensionnée, votre panneau sera également redimensionné trop.
Je sais, ce n'est pas la solution la plus élégante, mais elle fonctionne!
Une autre solution (qui est très similaire à Alex, mais un peu plus simple), c'est d'écouter les événements de la
JFrame
's de la racine volet de la place:Selon d'autres détails de l'implémentation, il est possible que la racine volet pourrait être changé. Si c'est une possibilité, alors vous pourriez remplacer
setRootPane()
et de les gérer. DepuissetRootPane()
est protégé et seulement appelé à partir du constructeur cependant, il est peu probable que vous aurez besoin de le faire.public void TestFrame() {
...?void
.