2010-08-17 2 views
5

Я использую GridLayout, пытаясь сделать автозагрузку ярлыков, не скрывая ничего из его содержимого. Вот простой код для проверки: каждый раз, когда я нажимаю кнопку, текст ярлыка становится больше, но только после того, как я изменяю размер окна по горизонтали, я получаю правильный макет. Есть ли способ исправить это, не изменяя размер окна? Я думаю, что я пробовал каждую собственность, и я все еще не могу заставить это работать, это сводит меня с ума!Проблема с макетами: ярлык автозагрузки (SWT)

Это то, что я получил

wrong layout

Вот как это должно быть

right layout

import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.SelectionAdapter; 
import org.eclipse.swt.events.SelectionEvent; 
import org.eclipse.swt.layout.GridData; 
import org.eclipse.swt.layout.GridLayout; 
import org.eclipse.swt.widgets.Button; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Label; 
import org.eclipse.swt.widgets.List; 
import org.eclipse.swt.widgets.Shell; 

public class UItest { 

    protected Shell shell; 
    private Label label; 

    public static void main(String[] args) { 
     try { 
      UItest window = new UItest(); 
      window.open(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void open() { 
     Display display = Display.getDefault(); 
     createContents(); 
     shell.open(); 
     shell.layout(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) { 
       display.sleep(); 
      } 
     } 
     display.dispose(); 
    } 

    protected void createContents() { 
     shell = new Shell(); 
     shell.setSize(450, 300); 
     shell.setText("SWT Application"); 
     shell.setLayout(new GridLayout(1, false)); 

     Button button = new Button(shell, SWT.NONE); 
     button.addSelectionListener(new SelectionAdapter() { 
      public void widgetSelected(SelectionEvent arg0) { 
       label.setText(label.getText() + " " + label.getText()); 
      } 
     }); 
     button.setText("New Button"); 

     label = new Label(shell, SWT.WRAP); 
     label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); 
     label.setText("New Label"); 

     List list = new List(shell, SWT.BORDER); 
     list.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); 

    } 

    protected Label getLabel() { 
     return label; 
    } 
} 

Спасибо за ваше время.


решаемые с этими изменениями:

Button button = new Button(shell, SWT.NONE); 
button.addSelectionListener(new SelectionAdapter() { 
    public void widgetSelected(SelectionEvent arg0) { 
     label.setText(label.getText() + " " + label.getText()); 
     shell.layout(); // ADDED THIS 
    } 
}); 
button.setText("New Button"); 

label = new Label(shell, SWT.WRAP); 
// SET HORIZONTAL GRAB ON LABEL (FIRST TRUE IN GridData CONSTRUCTOR) 
label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); 
label.setText("New Label"); 

ответ

6

Я думаю, проблема в том, что макет не признан недействительным, когда текст изменяется - попытаться заставить relayouting (по телефону getShell().layout(true, true)).

+0

Да! вот и все !, большое спасибо! –

+0

Я пробовал, но он полностью изменил Диалог ... –

Смежные вопросы