1 pièce(s) jointe(s)
Ouverture "glissée" d'un shell
Bonjour,
Est ce possible en SWT d'ouvrir un shell avec un effet ? Dans mon appli, je souhaiterais ouvrir un shell de manière "glissé" ou "progressif" lorsque je clique sur un bouton. Comme je ne suis pas très clair ;), j'ai mis un exemple de ce que je recherchais en pièce jointe.
Est ce faisable en SWT ou existe-t-il des bibliothèques open source le permettant ?
Merci :)
Je confirme à 200%, t'es un mec vraiment sympa :)
Citation:
Envoyé par
meddle
Bonsoir,
Bien sûr que c'est faisable :)
Dans ce code, la fenêtre fille est centrée. Tu peux jouer sur la vitesse
d'animation avec les constantes PAS et PAUSE...
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
public class Animation {
private static final int PAS = 10;
private static final int PAUSE = 5;
protected static void open(final Shell shell) {
final int x = (shell.getDisplay().getBounds().width - shell.getSize().x) / 2;
final int y = (shell.getDisplay().getBounds().height - shell.getSize().y) / 2;
shell.setLocation(x, shell.getDisplay().getBounds().height-100);
shell.open();
shell.getDisplay().syncExec(new Runnable() {
public void run() {
int currentY = shell.getDisplay().getBounds().height;
while (currentY>=y) {
shell.setLocation(x, currentY);
currentY = currentY - PAS;
try {
Thread.sleep(PAUSE);
} catch (InterruptedException e) {
// TODO Insérer le traitement de l'exception
}
}
}
});
}
/**
* @param args
*/
public static void main(String[] args) {
Display display = new Display();
final Shell shell = new Shell(display, SWT.SHELL_TRIM);
shell.setLayout(new FillLayout());
Button bouton = new Button(shell, SWT.PUSH);
bouton.setText("Ouverture");
bouton.addSelectionListener(new SelectionAdapter() {
/**
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent arg0) {
Shell fille = new Shell(shell, SWT.SHELL_TRIM);
fille.setLayout(new FillLayout());
Label label = new Label(fille, SWT.NONE);
label.setText("Coucou !");
fille.pack();
open(fille);
}
});
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
} |
Laurent
Une ola pour Laurent :yaisse2: :yaisse2: :yaisse2: :yaisse2:
Entre temps je m'étais fait quelque chose d'à peu près similaire (mais ce que tu as fait me parait plus propre) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| int hauteurPopUp = 28;
int pause = 2;
Shell shellFille = createShell(shellParent);
popUp.setLocation(shellParent.getLocation().x+72, shellParent.getLocation().y-1);
popUp.setSize(90, 1);
popUp.open();
for (int i=2; i < hauteurPopUp ; i++) {
popUp.setSize(90, i);
popUp.setLocation(shellParent.getLocation().x+72, shellParent.getLocation().y+(hauteurPopUp-i)-1);
popUp.redraw(shellParent.getLocation().x+72, shellParent.getLocation().y+(hauteurPopUp-i)-1, i, shellParent.getLocation().y+(hauteurPopUp-i)-1, true);
try {
Thread.sleep(pause);
} catch (InterruptedException e1) {}
}
popUp.pack(); |
Par contre, tu as le même soucis que moi : le "coucou" du label n'est affiché qu'à la fin et pas pendant la "remontée"... Mais bon, avec un temps de pause rapide, on ne voit rien de toutes façons ;)
Tu utilises la méthode Shell.setAlpha, c'est à partir de quelle version de SWT ? Pour moi, ça ne fonctionne pas (version 3.2.2). Mais je vais chercher l'équivalent de ce pas...
Merci encore !!! :D