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".
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".
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); } }
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); } }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager