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".
Version imprimable
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:
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 :ccool:
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:
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); } }