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

Agents de placement/Fenêtres Java Discussion :

JDesktopPane et bords magnétiques


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut JDesktopPane et bords magnétiques
    Salut à toutes et tous

    Est-il possible de rendre le bord des DesktopPane et InternalFrame magnétique ?
    Vous savez, quand les fenêtres vont se "coller" au bord du bureau lorsqu'elles en sont proches, le "snap".

  2. #2
    Membre expérimenté
    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
    Points : 1 340
    Points
    1 340
    Par défaut
    Salut,

    En utilisant un ComponentListener, cela correspond à ce que tu cherche ?

    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
     
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Rectangle;
    import java.awt.event.ComponentAdapter;
    import java.awt.event.ComponentEvent;
    import javax.swing.JDesktopPane;
    import javax.swing.JFrame;
    import javax.swing.JInternalFrame;
     
    @SuppressWarnings("serial")
    public class Fenetre extends JFrame {
     
    	public static void main(String[] args) {
    		Fenetre fenetre = new Fenetre();
    		fenetre.setLocationRelativeTo(null);
    		fenetre.setVisible(true);
    	}
     
    	public Fenetre() {
    		super("Externe");
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		setSize(new Dimension(500, 400));
     
    		final JDesktopPane desktop = new JDesktopPane();
    		setContentPane(desktop);
     
    		desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
     
    		JInternalFrame frame = new JInternalFrame("Interne", true, true, true, true);
    		frame.addComponentListener(new ComponentAdapter() {
    			@Override
    			public void componentMoved(ComponentEvent e) {
    				Component c = e.getComponent();
    				Rectangle location = c.getBounds();
    				System.out.print("Composant déplacé à " + location.x + ", " + location.y);
    				if (location.x < 0) {
    					c.setLocation(0, location.y);
    				} else if (location.x + location.width > desktop.getWidth()) {
    					c.setLocation(desktop.getWidth() - location.width, location.y);
    				}
    				if (location.y < 0) {
    					c.setLocation(location.x, 0);
    				} else if (location.y + location.height > desktop.getHeight()) {
    					c.setLocation(location.x, desktop.getHeight() - location.height);
    				}
    				System.out.println(" --> ajusté à " + location.x + ", " + location.y);
    			}
    		});
    	    frame.setBounds(0, 0, 200, 150);
    	    frame.setVisible(true);
     
    	    desktop.add(frame);		
    	}
     
    }

  3. #3
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    C'est en effet plus ou moins ce que je cherche C'est déjà une très bonne piste et je t'en remercie bcp

    Hélas il n'y a aucun feedback visuel de l'ajustement à venir lors du drag, ni même de possibilité de faire sortir une partie de la fenêtre.
    Ce qu'il me faudrait précisément, c'est l'outline de la fenêtre qui "résiste" en quelque sorte aux bords du desktop et des autres fenêtres.
    Autrement dit, lorsque l'outline touche un bord, elle s'y "colle" à moins de ne la déplacer de, par exemple, 20 pixels. De cette manière, on verrait au drag où elle se mettrait.

    Pour ceux qui bossent sous gnome et avec metacity, c'est ce mécanisme là que je recherche. Essayez de tirer une fenêtre contre une autre: elle va un peu résister et s'ajuster.

    ... Je me rends compte que mon explication n'est pas claire, mais ce n'est vraiment pas facile à décrire

    Edit: Peut-être la solution à mon problème http://java.sun.com/j2se/1.4.2/docs/...opManager.html Un peu de customisation et ça devrait aller

    Re-edit: pour ceux que ça intéresse:
    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
    package org.aspyct.ui.nonvisual;
     
    import javax.swing.DefaultDesktopManager;
    import javax.swing.JComponent;
    import javax.swing.JDesktopPane;
    import javax.swing.JInternalFrame;
     
     
    public class AspyctDesktopManager extends DefaultDesktopManager {
        private static final int DISTANCE = 20;
     
        @Override
        public void dragFrame(JComponent f, int newX, int newY) {
            JDesktopPane desktop = ((JInternalFrame)f).getDesktopPane();
     
            if(f.getX() == 0) {
                if(newX >= -DISTANCE && newX <= DISTANCE)
                    newX = 0;
            }
            else {
                int base = desktop.getWidth() - f.getWidth();
                if(f.getX() == base) {
                    if(newX >= base - DISTANCE && newX <= base + DISTANCE)
                        newX = base;
                }
            }
     
            if(f.getY() == 0) {
                if(newY >= -DISTANCE && newY <= DISTANCE)
                    newY = 0;
            }
            else {
                int base = desktop.getHeight() - f.getHeight();
                if(f.getY() == base) {
                    if(newY >= base - DISTANCE && newY <= base + DISTANCE)
                        newY = base;
                }
            }
     
            f.setLocation(newX, newY);
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Renforcer les bords d'un JDesktopPane
    Par rozwel dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 14/08/2007, 14h06
  2. Redimensionner avec le bord gauche et le bord haut
    Par WebPac dans le forum Composants VCL
    Réponses: 7
    Dernier message: 15/09/2004, 15h24
  3. Réponses: 11
    Dernier message: 11/07/2003, 16h47
  4. Dessiner un rectangle avec bords et texte ...
    Par Djedjeridoo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2003, 17h17

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