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

SWT/JFace Java Discussion :

GObject Critical error


Sujet :

SWT/JFace Java

  1. #1
    Membre chevronné
    Avatar de tails
    Homme Profil pro
    Inscrit en
    Novembre 2003
    Messages
    799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 799
    Points : 2 148
    Points
    2 148
    Billets dans le blog
    15
    Par défaut GObject Critical error
    Bonjour

    J'ai crée une petite source SWT sous Eclipse Helios (Kubuntu 10.10), affichant une fenetre dont la valeur du champ texte (read-only) est changeable grâce à une boite de dialogue personnalisée.

    Ma version de swt est la 3.5.2

    Mais j'obtiens l'erreur suivante dans Eclipse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GLib-GObject-CRITICAL **: g_object_get_qdata: assertion `G_IS_OBJECT (object)' failed
    De plus d'après cette page : http://markmail.org/message/iijya22ydh3qsc4f il s'agirait d'une erreur grave puisque l'on écrit sur de la mémoire qui ne nous est pas reservée.

    Pourtant, je ne comprends pas comment cela se fait-il, je pensais avoir pris les précautions necessaires dans mon code que voici
    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
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.layout.RowLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Combo;
    import org.eclipse.swt.widgets.Dialog;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Text;
     
     
    public class MySecondDialog extends Dialog {
     
    	public MySecondDialog(Shell parent) {
    		super(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
    	}
     
    	public String open(){
    		Shell shell = new Shell(Display.getCurrent(), getStyle());
    		shell.setText("My second dialog");
    		shell.setLayout(new GridLayout(2, false));
     
    		addContents(shell);
     
    		shell.pack();
    		shell.open();
    		Display display = Display.getCurrent();
    		while (!shell.isDisposed()) {
    			if (!display.readAndDispatch())
    				display.sleep();
    		}
    		return result;
    	}
     
    	public static void main(String[] args) {
    		Display display = new Display();
    		final Shell shell = new Shell(display);
    		shell.setText("Using my second dialog");
    		shell.setLayout(new RowLayout(SWT.VERTICAL));
     
    		final Text value = new Text(shell, SWT.READ_ONLY);
     
    		Button button = new Button(shell, SWT.PUSH);
    		button.setText("Changer la valeur");
    		button.addSelectionListener(new SelectionAdapter() {
     
    			@Override
    			public void widgetSelected(SelectionEvent e) {
    				MySecondDialog dialog = new MySecondDialog(shell);
    				String result = dialog.open();
    				if (result.length() > 0)
    					value.setText(result);
    			}
     
    		});
     
    		shell.pack();
    		shell.open();
    		while (!shell.isDisposed()) {
    			if (!display.readAndDispatch())
    				display.sleep();
    		}
    		display.dispose();
    	}
     
    	private void addContents(final Shell shell) {
    		new Label(shell, SWT.NONE).setText("Statut");
    		final Combo combo = new Combo(shell, SWT.DROP_DOWN);
    		for (String currentValue : values)
    			combo.add(currentValue);
    		Button okButton = new Button(shell, SWT.PUSH);
    		okButton.setText("Ok");
    		okButton.addSelectionListener(new SelectionAdapter() {
     
    			@Override
    			public void widgetSelected(SelectionEvent e) {
    				result = combo.getText();
    				shell.close();
    			}
     
    		});
     
    		Button cancelButton = new Button(shell, SWT.PUSH);
    		cancelButton.setText("Cancel");
    		cancelButton.addSelectionListener(new SelectionAdapter() {
     
    			@Override
    			public void widgetSelected(SelectionEvent e) {
    				result = "";
    				shell.close();
    			}
     
    		});
    	}
     
    	private String result;
    	private final String values [] = {"Monsieur", "Madamme", "Mademoiselle"};
     
    }
    Quelqu'un saurait-il pourquoi ?
    Je vous remercie d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 187
    Points : 434
    Points
    434
    Par défaut
    Bonjour,

    Il y a une petite erreur dans le code : dans la méthode MySecondDialog.open() tu crée une instance de Shell en passant Display.getCurrent() en paramètre : il faut passer getParent() à la place. En gros tu fais une modal sans définir le parent, c'est pas bien !

    Peut être sans rapport avec ton plantage cependant...

  3. #3
    Membre chevronné
    Avatar de tails
    Homme Profil pro
    Inscrit en
    Novembre 2003
    Messages
    799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 799
    Points : 2 148
    Points
    2 148
    Billets dans le blog
    15
    Par défaut Je ne suis pas certain que l'erreur vient de là
    Bonjour ,

    Washmid : je suppose que tu me parles de la ligne 22 (ou sinon de la ligne 30). Je ne vois pourtant pas où serait l'erreur : car le Display représentant mon OS, il n'y a qu'un selon moi qu'un moyen de l'obtenir :

    De plus n'existe pas, en revanche oui

    Sinon, que devrais-je écrire à la place ?

  4. #4
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 162
    Points : 255
    Points
    255
    Par défaut
    Bonjour Tails,

    Je n'ai pas forcément de solution à te proposer pour ton problème, cela dit, j'ai peut-être une piste.

    Pour commencer, je vois que ta classe étend la classe "Dialog", qui fournit donc par défaut, déjà un bouton "Ok", et un bouton "Cancel".

    Pourquoi en rajoutes-tu donc dans ce cas ?

    Sinon en ce qui concerne ton problème, je pense que cela pourrait peut-être venir de l'utilisation de la méthode "shell.close()".

    J'ai déjà eu recours à cette méthode, et j'ai eu des problèmes assez étrange, cette méthode ferme la boite de dialogue un peu sauvagement, il est préférable de passer par les méthodes "okpressed()" ou "cancelpressed()" qui te serviront donc à redéfinir le comportement lors du click sur le bouton ok ou cancel, et donc à fermer proprement la boite de dialogue.
    La forme même des pyramides prouve que l'être humain tend à en faire de moins en moins.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 187
    Points : 434
    Points
    434
    Par défaut
    Je parlais effectivement de la ligne 22.

    La méthode getParent() est définie dans la classe Dialog, et te permet de récupérer dans ta méthode open() le paramètre "parent" qui a été précédemment passé au constructeur de MySecondDialog (et par extension à celui de Dialog).

    Le souci c'est que tu demandes à l'appelant (ton main) de spécifier un parent... que tu n'utilise pas

    Par contre tu utilise correctement le second paramètre : le style "SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL", via l'appel à Dialog.getStyle().

    En étudiant la doc / les sources de Dialog, on constate que le style est "traité" comme un simple indicateur, puis ensuite "recalculé" en partant du principe qu'il sera appliqué à un Shell ayant un parent (car obligatoire dans le constructeur de Dialog)... Ce qui n'est pas ton cas, et est potentiellement une source de problèmes.

    Il y a deux solutions pour être cohérent :
    - ne pas hériter de Dialog et faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Shell(Display.getCurrent(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL)
    - hériter de Dialog et faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Shell(getParent(), getStyle())
    (le mieux à mon sens)

    Pfiou, j'espère avoir été compréhensible

    Ceci dit les close() posent parfois des problèmes étranges, avec des tentatives d'appel à des objets natifs "disposed". @narko : heu, tu ne confonds pas avec les Dialog d'eclipse RCP...?

    PS : en relisant la doc de Dialog sur mon poste, l'exemple d'utilisation livré avec est foireux, mais en inversé : le parent est utilisé mais pas le style

    EDIT : oups, erreur corrigée dans le 2me exemple.

  6. #6
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 162
    Points : 255
    Points
    255
    Par défaut
    Citation Envoyé par Washmid Voir le message
    Ceci dit les close() posent parfois des problèmes étranges, avec des tentatives d'appel à des objets natifs "disposed". @narko : heu, tu ne confonds pas avec les Dialog d'eclipse RCP...?
    Au temps pour moi, j'ai confondu avec les boites de dialogues de JFace
    La forme même des pyramides prouve que l'être humain tend à en faire de moins en moins.

  7. #7
    Membre chevronné
    Avatar de tails
    Homme Profil pro
    Inscrit en
    Novembre 2003
    Messages
    799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 799
    Points : 2 148
    Points
    2 148
    Billets dans le blog
    15
    Par défaut J'ai appliqué tes conseils : sans effet :(
    Bonjour,

    j'ai conservé la méthode de l'héritage pour ma boite de dialogue et j'ai remplacé la fameuse ligne 22, où je réutilise le Shell parent. Mais le warning inhérent à SWT subsite. Voici le nouveau code :
    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
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.layout.RowLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Combo;
    import org.eclipse.swt.widgets.Dialog;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Text;
     
     
    public class MySecondDialog extends Dialog {
     
    	public MySecondDialog(Shell parent) {
    		super(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
    	}
     
    	public String open(){
    		Shell shell = new Shell(getParent(), getStyle());
    		shell.setText("My second dialog");
    		shell.setLayout(new GridLayout(2, false));
     
    		addContents(shell);
     
    		shell.pack();
    		shell.open();
    		Display display = Display.getCurrent();
    		while (!shell.isDisposed()) {
    			if (!display.readAndDispatch())
    				display.sleep();
    		}
    		return result;
    	}
     
    	public static void main(String[] args) {
    		Display display = new Display();
    		final Shell shell = new Shell(display);
    		shell.setText("Using my second dialog");
    		shell.setLayout(new RowLayout(SWT.VERTICAL));
     
    		final Text value = new Text(shell, SWT.READ_ONLY);
     
    		Button button = new Button(shell, SWT.PUSH);
    		button.setText("Changer la valeur");
    		button.addSelectionListener(new SelectionAdapter() {
     
    			@Override
    			public void widgetSelected(SelectionEvent e) {
    				MySecondDialog dialog = new MySecondDialog(shell);
    				String result = dialog.open();
    				if (result.length() > 0)
    					value.setText(result);
    			}
     
    		});
     
    		shell.pack();
    		shell.open();
    		while (!shell.isDisposed()) {
    			if (!display.readAndDispatch())
    				display.sleep();
    		}
    		display.dispose();
    	}
     
    	private void addContents(final Shell shell) {
    		new Label(shell, SWT.NONE).setText("Statut");
    		final Combo combo = new Combo(shell, SWT.DROP_DOWN);
    		for (String currentValue : values)
    			combo.add(currentValue);
    		Button okButton = new Button(shell, SWT.PUSH);
    		okButton.setText("Ok");
    		okButton.addSelectionListener(new SelectionAdapter() {
     
    			@Override
    			public void widgetSelected(SelectionEvent e) {
    				result = combo.getText();
    				shell.close();
    			}
     
    		});
     
    		Button cancelButton = new Button(shell, SWT.PUSH);
    		cancelButton.setText("Cancel");
    		cancelButton.addSelectionListener(new SelectionAdapter() {
     
    			@Override
    			public void widgetSelected(SelectionEvent e) {
    				result = "";
    				shell.close();
    			}
     
    		});
    	}
     
    	private String result;
    	private final String values [] = {"Monsieur", "Madamme", "Mademoiselle"};
     
    }
    Je pense aussi, comme maintenant j'ai appris les rudiments de JFace, que le mieux pour moi serait de personnaliser les boites de dialogues de JFace (si cela est recommandé : comme j'ai vu qu'on ne recommande pas toujours d'hériter de classe SWT/JFace).

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 187
    Points : 434
    Points
    434
    Par défaut
    Arf, j'espérais un problème de cohérence style/parent, mais apparemment ce n'est pas le cas

    Au hasard, Le problème se pose-t-il aussi :
    - lors de la fermeture "alt-F4" de la Dialog?
    - si tu ne crée pas le champ de saisie et / ou les boutons?
    - si tu utilises un autre layout / pas de layout? (déjà vu ^^)
    - si le champ texte de test n'a pas le style READ_ONLY?
    - avec la version 3.6 ou 3.7 de SWT? (cf. le bug des boutons non cliquables dans les boites de dialogue)


    Sinon oui, les composants jface sont bien sympa, rester sur du SWT pur faut aimer ça

  9. #9
    Membre chevronné
    Avatar de tails
    Homme Profil pro
    Inscrit en
    Novembre 2003
    Messages
    799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 799
    Points : 2 148
    Points
    2 148
    Billets dans le blog
    15
    Par défaut Je l'ai testé depuis Eclipse
    Salut

    à vrai dire c'est un code que j'ai tenté de réaliser alors que j'étais encore à la phase d'apprentissage de SWT. De plus, je me contente de réaliser le projet sous Eclipse (Helios + Kubuntu 10.10) en important le jar swt existant.

    Mais par contre, je ne sais pas trop encore comment faire des boites de dialogues personnalisées et récupérer le retour avec JFace (j'ai utilisé les TitleAreaDialog, mais je ne sais pas comment en récupérer les informations personnalisées telles que les radioButtons ajoutés ...)

Discussions similaires

  1. Critical error c0000374
    Par Gurdile dans le forum C
    Réponses: 13
    Dernier message: 30/11/2013, 13h24
  2. phpBB : Critical Error . . . Suite changement MDP
    Par eva98 dans le forum Installation
    Réponses: 0
    Dernier message: 08/05/2008, 09h25
  3. [gtkmm] critical error emplacement
    Par drKzs dans le forum GTK+
    Réponses: 4
    Dernier message: 14/06/2007, 20h39
  4. [NASM] Critical error (code 5)
    Par fabnet dans le forum Assembleur
    Réponses: 11
    Dernier message: 25/03/2005, 19h51
  5. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51

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