2010-07-05 108 views
1

我一直在這裏b for了一陣子,而且我似乎無法找到任何地方。我已經嘗試了所有我可以在網上找到的例子,似乎沒有任何工作!我一直無法找到這個問題,導致我認爲我錯過了一些基本的東西。 。 。Eclipse RCP對話框:大文本框不會滾動 - 而是創建一個巨大的對話窗口!

在我的Eclipse RCP程序中,我想顯示一個對話框,顯示加載數據文件時發生的錯誤列表。我重寫了TitleAreaDialog,並且只想顯示包含錯誤列表和OK按鈕的可滾動文本。

問題是,文本垂直滾動條不會變爲活動 - 文本只是越來越高,以適應文本。這會使對話框窗口的高度增加,直到它適合文本框或直到它達到屏幕的高度 - 然後它就會切斷文本框的底部。

如何防止對話框/文本框變得太大?我錯過了什麼?

感謝您的幫助!
-Christine

...

下面是一個簡單的程序顯示我的對話:

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; 
    } 
} 

回答

3

分配大小的對話框;否則,該對話框將佈置孩子們要求他們的「首選」大小(對於文本小部件來說這是無限的),並相應地調整自己的大小。

[編輯]此版本的作品。詳情請參閱我的評論。

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

感謝您的回覆亞倫。你說的話是有道理的,這是我認爲我的問題所在。 如何/在哪裏可以設置對話框的大小? 'TitleAreaDialog'不公開任何我能找到的setSize(或類似的)方法。我嘗試在每個我有權訪問的位置設置ScrollableDialog中父對象的大小,但每次都忽略它。 有什麼建議嗎? 再次感謝! -Christine – Chris 2010-07-05 16:12:46

+0

在'createDialogArea()'中,調用'getShell()'並設置其大小。 – 2010-07-06 08:18:06

+0

嗯,這調整了對話框的大小,但它又一次切斷了文本框的底部。文本框繼續在窗口底部的下方,滾動條仍然變灰(我看不到它的底部)。任何其他想法? – Chris 2010-07-06 11:28:30

相關問題