2015-02-27 2 views
1

Я пытаюсь поместить композит FormLayout в сетку GridLayout, но я получаю исключение. Я что-то делаю неправильно или это просто невозможно? Вот мой код:Можно ли положить FormLayout в GridLayout?

import org.eclipse.swt.SWT; 
import org.eclipse.swt.layout.FormAttachment; 
import org.eclipse.swt.layout.FormData; 
import org.eclipse.swt.layout.FormLayout; 
import org.eclipse.swt.layout.GridLayout; 
import org.eclipse.swt.widgets.Button; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 

public class formlayout { 
    public static void main(String[] args) 
    { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 
     GridLayout layout= new GridLayout(1, false); 
     shell.setLayout(layout); 

     Composite inputs = new Composite(shell, SWT.NONE); 
     inputs.setLayout(new FormLayout()); 
     FormData fd1 = new FormData(); 
     fd1.left = new FormAttachment(0, 0); 
     fd1.right = new FormAttachment(100,0); 
     inputs.setLayoutData(fd1); 

     Button button1 = new Button(shell, SWT.PUSH); 
     button1.setText("B1"); 
     button1.setLayoutData(new FormData()); 
     FormData formData = new FormData(); 
     formData.left = new FormAttachment(20,0); 
     formData.right = new FormAttachment(100,0); 
     button1.setLayoutData(formData); 

     Button button2 = new Button(shell, SWT.PUSH); 
     button2.setText("B2"); 
     button2.setLayoutData(new FormData()); 
     FormData formData2 = new FormData(); 
     formData2.left = new FormAttachment(0,0); 
     formData2.right = new FormAttachment(20,0); 
     button2.setLayoutData(formData2);  

     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) { 
      display.sleep(); 
      } 
     } 
     display.dispose(); 
    } 
} 

Исключение я получаю:

Exception in thread "main" java.lang.ClassCastException: org.eclipse.swt.layout.FormData cannot be cast to org.eclipse.swt.layout.GridData 

Это, конечно, только пример сценария, чтобы продемонстрировать эту проблему. На самом деле оболочка определяется ниже в коде, и она настроена как GridLayout, поэтому я не могу ее изменить, но мне все равно нужно использовать FormLayout для достижения моей цели с помощью кнопок.

+0

Статья [Понимание макетов в SWT] (https://www.eclipse.org/articles/article.php?file=Article-Understanding-Layouts/index.html) дает хорошее представление об использовании макетов в SWT. –

ответ

3

В этом коде:

Composite inputs = new Composite(shell, SWT.NONE); 
inputs.setLayout(new FormLayout()); 
FormData fd1 = new FormData(); 
fd1.left = new FormAttachment(0, 0); 
fd1.right = new FormAttachment(100,0); 
inputs.setLayoutData(fd1); 

вы устанавливаете FormData в данном макете для inputs. Данные компоновки используются макетом, указанным для родителя элемента управления - в этом случае родительский элемент равен shell, который использует GridLayout.

Так что, когда макет сетки для shell делает макет он ожидает все свои детей, чтобы иметь в данном макете GridData, но у вас есть FormData так литой он делает не удается.

Укажите GridData для данных макета inputs, просто использовать FormData для дочерних элементов управления в inputs.

+0

Хорошо, я вижу ... это сработало, спасибо еще раз :) – user1985273

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