2010-07-05 1 views
1

Ça fait un bout de temps que je me bouscule et je n'arrive pas à aller nulle part. J'ai essayé tous les exemples que je peux trouver en ligne et rien ne semble fonctionner! Je n'ai pas été capable de trouver beaucoup sur ce problème, ce qui me porte à penser qu'il me manque quelque chose de fondamental. . .Boîte de dialogue Eclipse RCP: la zone de texte large ne défile pas - crée plutôt une énorme fenêtre de dialogue!

Dans mon programme Eclipse RCP, je souhaite afficher une boîte de dialogue qui affiche une liste d'erreurs survenues lors du chargement d'un fichier de données. J'ai surchargé TitleAreaDialog et je veux simplement afficher un texte défilant contenant la liste des erreurs et un bouton OK.

Le problème est que les barres de défilement vertical du texte ne deviennent pas actives - le texte devient plus grand pour s'adapter au texte. Cela augmente la hauteur de la fenêtre de dialogue jusqu'à ce qu'elle corresponde à la zone de texte ou jusqu'à ce qu'elle atteigne la hauteur de l'écran, puis elle coupe simplement le bas de la zone de texte. Comment éviter que la boîte de dialogue/boîte de dialogue ne devienne trop grande?

Qu'est-ce que je rate?

Merci pour votre aide !!
-Christine

...

Voici un programme simple montrant mon dialogue:

import org.eclipse.jface.dialogs.IMessageProvider; 
import org.eclipse.jface.dialogs.TitleAreaDialog; 
import org.eclipse.swt.*; 
import org.eclipse.swt.events.SelectionAdapter; 
import org.eclipse.swt.events.SelectionEvent; 
import org.eclipse.swt.layout.*; 
import org.eclipse.swt.widgets.*; 


public class ScrollableDialogRunner { 

    public static void main(String[] args) { 
     System.out.println("starting"); 
     Display display = new Display(); 
     Shell shell = new Shell (display); 

     String errors = "one\ntwo\nthree\nfour\nfive\n"; 
     for(int i = 0; i < 5; i++){ 
      errors += errors; 
     } 

     ScrollableDialog dialog = new ScrollableDialog(shell, "Errors occurred during load", "The following errors occurred while loaded file 'x.data'", errors); 
     dialog.open(); 
    } 
} 


class ScrollableDialog extends TitleAreaDialog { 
    private String title; 
    private String text; 
    private String scrollableText; 

    public ScrollableDialog(Shell parentShell, String title, String text, String scrollableText) { 
     super(parentShell); 
     this.title = title; 
     this.text = text; 
     this.scrollableText = scrollableText; 
    } 

    @Override 
    protected Control createDialogArea(Composite parent) { 
     GridLayout layout = new GridLayout(); 
     layout.numColumns = 1; 
     parent.setLayout(layout); 

     GridData gridData = new GridData(); 
     gridData.grabExcessHorizontalSpace = true; 
     gridData.horizontalAlignment = GridData.FILL; 

     Text scrollable = new Text(parent, SWT.BORDER | SWT.V_SCROLL); 
     scrollable.setLayoutData(gridData); 
     scrollable.setText(scrollableText); 

     return parent; 
    } 

    @Override 
    public void create() { 
     super.create(); 

     setTitle(title); 
     setMessage(text, IMessageProvider.ERROR); 
    } 

    @Override 
    protected void createButtonsForButtonBar(Composite parent) { 
     Button okButton = createButton(parent, OK, "OK", true); 
     okButton.addSelectionListener(new SelectionAdapter() { 

      @Override 
      public void widgetSelected(SelectionEvent e) { 
       close(); 
      } 
     }); 
    } 

    @Override 
    protected boolean isResizable() { 
     return false; 
    } 
} 

Répondre

3

Attribuer une taille à la boîte de dialogue; sinon, la boîte de dialogue mettra en page les enfants en leur demandant leur taille "préférée" (qui est infinie pour le widget texte) et se redimensionnera en conséquence.

[EDIT] Cette version fonctionne. Voir mes commentaires pour plus de détails.

class ScrollableDialog extends TitleAreaDialog { 
    private String title; 
    private String text; 
    private String scrollableText; 

    public ScrollableDialog(Shell parentShell, String title, String text, String scrollableText) { 
     super(parentShell); 
     this.title = title; 
     this.text = text; 
     this.scrollableText = scrollableText; 
    } 

    @Override 
    protected Control createDialogArea(Composite parent) { 
     Composite composite = (Composite) super.createDialogArea (parent); // Let the dialog create the parent composite 

     GridData gridData = new GridData(); 
     gridData.grabExcessHorizontalSpace = true; 
     gridData.horizontalAlignment = GridData.FILL; 
     gridData.grabExcessVerticalSpace = true; // Layout vertically, too! 
     gridData.verticalAlignment = GridData.FILL; 

     Text scrollable = new Text(composite, SWT.BORDER | SWT.V_SCROLL); 
     scrollable.setLayoutData(gridData); 
     scrollable.setText(scrollableText); 

     return composite; 
    } 

    @Override 
    public void create() { 
     super.create(); 

     // This is not necessary; the dialog will become bigger as the text grows but at the same time, 
     // the user will be able to see all (or at least more) of the error message at once 
     //getShell().setSize (300, 300); 
     setTitle(title); 
     setMessage(text, IMessageProvider.ERROR); 

    } 

    @Override 
    protected void createButtonsForButtonBar(Composite parent) { 
     Button okButton = createButton(parent, OK, "OK", true); 
     okButton.addSelectionListener(new SelectionAdapter() { 

      @Override 
      public void widgetSelected(SelectionEvent e) { 
       close(); 
      } 
     }); 
    } 

    @Override 
    protected boolean isResizable() { 
     return true; // Allow the user to change the dialog size! 
    } 
} 
+0

Merci pour la réponse Aaron. Ce que vous dites a du sens et c'est dans le sens de ce que je pensais que mon problème était. Comment/où puis-je définir la taille de la boîte de dialogue? 'TitleAreaDialog' n'expose aucune méthode setSize (ou similaire) que je puisse trouver. J'ai essayé de définir la taille du parent à l'intérieur de ScrollableDialog à chaque endroit où j'y avais accès mais chaque fois il semble juste être ignoré. Des suggestions? Merci encore! -Christine – Chris

+0

Dans 'createDialogArea()', appelez 'getShell()' et définissez sa taille. –

+0

Hmm, cela a redimensionné la boîte de dialogue, mais encore une fois, il suffit de couper le bas de la zone de texte. La zone de texte continue bien au-dessous du bas de la fenêtre et la barre de défilement est toujours grisée (je ne peux pas voir le fond de celle-ci non plus). D'autres idées? – Chris

Questions connexes