tu peux me donner la stacktrace stp ?
Version imprimable
tu peux me donner la stacktrace stp ?
Voici la stacktrace :
Citation:
java.lang.NullPointerException
at org.eclipse.jface.dialogs.DialogPage.setVisible(DialogPage.java:470)
at com.eclipse.rcp.jlistconf.view.Parametrages.showPage(Parametrages.java:262)
at com.eclipse.rcp.jlistconf.view.Parametrages.nextPressed(Parametrages.java:193)
at com.eclipse.rcp.jlistconf.view.Parametrages.buttonPressed(Parametrages.java:174)
at com.eclipse.rcp.jlistconf.view.Parametrages$3.widgetSelected(Parametrages.java:149)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:234)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604)
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438)
at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at com.eclipse.rcp.jlistconf.Application.start(Application.java:20)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:620)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:575)
at org.eclipse.equinox.launcher.Main.run(Main.java:1408)
at org.eclipse.equinox.launcher.Main.main(Main.java:1384)
ok, ce qu'il manque c'est le control dans la page
il n'est créé qu'à la demande, modifie showPage de cette matnière :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 public void showPage(IWizardPage page) { if (page != currentPage) { IWizardPage old = currentPage; currentPage = page; Control pageControl=currentPage.getControl(); if ( pageControl==null ) { currentPage.createControl(container); pageControl = currentPage.getControl(); } layout.topControl = pageControl; if( old != null ) { old.setVisible( false ); } currentPage.setVisible( true ); container.layout(); update(); } }
Ok je n'ai plus l'exception. Par contre d'après mes tests la page change mais les composants restent les mêmes.
à la place de container.layout() dans showPage essaye juste de faire
getShell().layout(true, true);
juste pour voir
Ca affichait la seconde page mais en dessous de la première (lorsque je clique sur next). Au final tous les composants sont sur la même page.
y'a un problème de layout quelque part, faut que tu me redonnes le code de ta méthode createPartControl(Composite parent) de ta vue
Ouai.
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 public void createPartControl(Composite parent) { viewcomposite = new Composite (parent, SWT.NONE); viewcomposite.setLayout(new GridLayout()); container = new Composite(viewcomposite, SWT.NONE); layout = new StackLayout(); container.setLayout(layout); myWizard = new MyWizard(container){ @Override public IWizardContainer getContainer() { return Parametrages.this; } }; myWizard.addPages(); parent.addDisposeListener( new DisposeListener() { public void widgetDisposed(DisposeEvent e) { myWizard.dispose(); } } ); showStartingPage(); GridData buttonBarGD = new GridData(GridData.FILL_HORIZONTAL); buttonBarGD.grabExcessVerticalSpace = true; buttonBarGD.horizontalIndent = 640; createButtonBar(viewcomposite).setLayoutData(buttonBarGD); }
tout est ok dans cette méthode.
donc le problème vient de ta création de page, je vois pas autre chose
tu as des classes (une par page, donc par étape) qui étendent directement WizardPage ou mieux une classe du genre :
avec une méthode du genre :Code:
1
2 public abstract class AbstractWizardPage extends WizardPage { }
et dans l'implémentation,Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 public void createControl(Composite parent) { // attention : il est important de ne pas modifier le layout de parent, puisqu'il s'agit du composite référencé par container dans la vue, donc un composant qui doit rester layouté par un stacklayout Composite control = new Composite( parent, SWT.NONE ); // par défaut, on met un FillLayout, mais la méthode createPageControls peut modifier ce layout en fonction de ses besoins control.setLayout(new FillLayout()); // on délègue la construction des composants de la page à une sous méthode createPageControls( control ); // mandatory setControl( control ); } protected abstract void createPageControls(Composite pageComposite);
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 public class MyPage1 extends AbstractWizardPage { ... protected void createPageControls(Composite pageComposite) { // ici on peut modifier le layout global de la page, par exemple un TableColumnLayout // pageComposite.setLayout(new TableColumnLayout()); table = new Table(pageComposite,...); ... } }
Bhe ouai :s
Par exemple pour ma première page j'ai ça :
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
83 public class MyPageOne extends WizardPage { private Text textLieu = null; private Text textMat = null; private Label labelListMat = null; private Table tableMat = null; private Composite parent = null; private Composite container; private ParametrageControllerWPageOne parametrageControllerWPageOne = null; public MyPageOne(Composite container) { super("First Page"); parametrageControllerWPageOne = new ParametrageControllerWPageOne(this); this.container = container; } public void createControl(Composite parent) { System.out.println("1er Page"); setTitle("Sélection du lieu de l'affaire"); setDescription("Wizard jListConf. Sélection de l'affaire"); this.parent = this.container; GridLayout layout = new GridLayout(); container.setLayout(layout); layout.numColumns = 3; layout.marginLeft = 300; Label labelTitre = new Label(container,SWT.NONE); labelTitre.setText("Sélection du lieu de l'affaire et des matrices de test"); labelTitre.setFont(new Font(null,"Arial",14,0)); GridData titreGD = new GridData(GridData.FILL_HORIZONTAL); titreGD.horizontalSpan = 3; titreGD.heightHint = 70; labelTitre.setLayoutData(titreGD); Label labelLieu = new Label(container, SWT.NONE); labelLieu.setText("Lieu de l'affaire : "); labelLieu.setFont(new Font(null,"Arial",10,0)); labelLieu.setToolTipText("Indiquer le dossier racine de l'affaire"); textLieu = new Text(container, SWT.BORDER); textLieu.setText("Chemin de l'affaire"); textLieu.setFont(new Font(null,"Arial",10,0)); textLieu.setEditable(false); GridData affaireGD = new GridData(GridData.CENTER); affaireGD.widthHint = 300; textLieu.setLayoutData(affaireGD); Button btnLieuAffaire = new Button(container, SWT.NONE); btnLieuAffaire.setText("..."); btnLieuAffaire.addSelectionListener(new AffaireSelectionListenerW(parametrageControllerWPageOne)); Label labelMat = new Label(container, SWT.NONE); labelMat.setText("Lieu des matrices de test : "); labelMat.setFont(new Font(null,"Arial",10,0)); labelMat.setToolTipText("Indiquer le dossier racine des matrices de test"); textMat = new Text(container, SWT.BORDER); textMat.setText("Chemin des matrices de test"); textMat.setFont(new Font(null,"Arial",10,0)); textMat.setEditable(false); affaireGD.widthHint = 300; textMat.setLayoutData(affaireGD); Button btnLieuMat = new Button(container, SWT.NONE); btnLieuMat.setText("..."); btnLieuMat.addSelectionListener(new MatSelectionListenerW(parametrageControllerWPageOne)); // Required to avoid an error in the system setControl(container); setPageComplete(false); } ... }
this.container, c'est le container de ton wizardCode:
1
2
3
4
5
6 this.parent = this.container; GridLayout layout = new GridLayout(); container.setLayout(layout); layout.numColumns = 3; layout.marginLeft = 300;
tu changes son layout en faisant :
et il faut pas : c'est le container de toutes les pages, il a son propre layout (un stacklayout, parce qu'il a plusieurs pages à afficher alternativement) et il contient des pages qui ont chacune leur layout,Code:
1
2 GridLayout layout = new GridLayout(); container.setLayout(layout);
après tu fais :
tu créés ton label directement dans le wizard, pas dans la pageCode:Label labelTitre = new Label(container,SWT.NONE);
il faut faire
ou parent est l'argument de la méthode createControlCode:Label labelTitre = new Label(parent,SWT.NONE);
tu peux faire bien sur :
Code:
1
2 Composite comp = new Composite(parent,SWT.NONE); Label labelTitre = new Label(comp,SWT.NONE);
c'est parce que tu les créés dans container que tous tes composants de toutes tes pages finissent par apparaître les uns en dessous des autres dans le container
Ah d'accord.
Du coup j'ai fait ça :
Bon par contre plus rien de s'affiche. Du moins la première page.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 public void createControl(Composite parent) { System.out.println("1er Page"); setTitle("Sélection du lieu de l'affaire"); setDescription("Wizard jListConf. Sélection de l'affaire"); this.parent = parent; comp = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); comp.setLayout(layout); layout.numColumns = 3; layout.marginLeft = 300; Label labelTitre = new Label(comp,SWT.NONE); labelTitre.setText("Sélection du lieu de l'affaire et des matrices de test"); labelTitre.setFont(new Font(null,"Arial",14,0)); GridData titreGD = new GridData(GridData.FILL_HORIZONTAL); titreGD.horizontalSpan = 3; titreGD.heightHint = 70; labelTitre.setLayoutData(titreGD); Label labelLieu = new Label(comp, SWT.NONE); labelLieu.setText("Lieu de l'affaire : "); labelLieu.setFont(new Font(null,"Arial",10,0)); labelLieu.setToolTipText("Indiquer le dossier racine de l'affaire"); textLieu = new Text(comp, SWT.BORDER); textLieu.setText("Chemin de l'affaire"); textLieu.setFont(new Font(null,"Arial",10,0)); textLieu.setEditable(false); GridData affaireGD = new GridData(GridData.CENTER); affaireGD.widthHint = 300; textLieu.setLayoutData(affaireGD); Button btnLieuAffaire = new Button(comp, SWT.NONE); btnLieuAffaire.setText("..."); btnLieuAffaire.addSelectionListener(new AffaireSelectionListenerW(parametrageControllerWPageOne)); Label labelMat = new Label(comp, SWT.NONE); labelMat.setText("Lieu des matrices de test : "); labelMat.setFont(new Font(null,"Arial",10,0)); labelMat.setToolTipText("Indiquer le dossier racine des matrices de test"); textMat = new Text(comp, SWT.BORDER); textMat.setText("Chemin des matrices de test"); textMat.setFont(new Font(null,"Arial",10,0)); textMat.setEditable(false); affaireGD.widthHint = 300; textMat.setLayoutData(affaireGD); Button btnLieuMat = new Button(comp, SWT.NONE); btnLieuMat.setText("..."); btnLieuMat.addSelectionListener(new MatSelectionListenerW(parametrageControllerWPageOne)); // Required to avoid an error in the system setControl(comp); setPageComplete(false); }
tu veux dire rien ne s'affiche sauf la première page ?Citation:
Bon par contre plus rien de s'affiche. Du moins la première page.
ou rien ne s'affiche de la première page ?
je vois pas trop pourquoi rien ne s'afficherait,
bon tu met 300px de marge, ça fait beaucoup, mais je suppose que tu affiche ton workbench sur plus de 300px de large (sinon forcément tous tes composants sont en dehors de ta fenêtre).
par contre je vois que tu recycle affaireGD sur textLieu et textMat : il faut absolument utiliser des instances différentes de GridData pour des composants différents (il y a un cache dans GridData que GridLayout exploite)
essaye d'enlever tous tes hints déjà pour voir si tes composants ne sortent pas de la partie visible de ta vue
Non, toujours pareil rien ne s'affiche sur la première page.
en général, quand quielquechose ne s'affiche pas c'est qu'il y a un problème de layout quelquepart
c'est très difficile à déboguer ou à tracer.
bon à priori tu passes bien par ta méthode createControl de ta page, puisque que à un moment tu as eu quelque chose d'affiché.
moi quand c'est comme ça, je rajoute un background différent sur chacun des composites que je créé, pour voir à partir de quel niveau le layout n'est pas bon
commence par en mettre sur les composites crées dans ta vue
avec des couleurs différentes bien marquées (SWT.COLOR_RED, SWT.COLOR_BLUE par exemple) tu verras rapidement quel composite n'est pas bien layoutéCode:compositeTruc.setBackground(compositeTruc.getDisplay().getSystemColor(SWT.COLOR_xxx));(
Donc le container "container" qui doit contenir les éléments des pages est bien créée mais elle est vide.
Par contre dans createControl j'ai colorié comp en jaune et il n'apparait pas.
Pourtant j'y rentre bien vu que j'affiche "1er Page"
si tu passes en debug, avec un breakpoint dans la méthode showPage, au début de ce bloc :
tu dois pouvoir voir :Code:
1
2
3
4
5 Control pageControl=currentPage.getControl(); if ( pageControl==null ) { currentPage.createControl(container); pageControl = currentPage.getControl(); }
- si tu passes bien là
- ce que vaut pageControl
- si createControl est appelé
- si pageControl vaut null ou pas après l'appel de currentPage.createControl(container)
- si topControl de layout prend bien comme valeur la référence pageControl
Le truc c'est que maintenant le bouton next est grisé du coup je ne peux pas cliquer dessus et donc entrer dans showpage à cet endroit là.
tu as au moins la première page qui s'affiche, puisqu'on a
Code:
1
2
3
4
5
6 IWizardPage startingPage = myWizard.getStartingPage(); if (startingPage == null) { } else { startingPage.createControl(parent); showPage(startingPage); }
code que tu as dû déplacé de createPartControl(Composite parent) de ta vue vers ta méthode
ensuite si le bouton next est grisé c'est que tu as fait un setPageComplete(false) après ta construction de page, ce qui est bien (si tu as des informations obligatoires en saisie dans cette page)Code:showStartingPage();
ensuite tu dois géré la détection de la saisie (en mettant des évenements sur des Text (et peut être ta table si tu y mets des éditeurs), et appeler setPageComplete(true) ou setPageComplete(false) en fonction du fait que tous tes champs sont remplis ou non, et ton bouton next sera grisé ou pas en fonction
pour tes tests tu peux forcer setPageComplete(true) au début, comme tu n'exploites aucune saisie, ça te permet de faire défiler toutes tes pages jusqu'à la fin pour vériifier que tout est ok