2014-11-17 3 views
0

Мастер Eclipse Wizard вычисляет размер своего окна в зависимости от размера самой большой страницы мастера. Вот почему я испытываю трудности с тем, чтобы Label обернуть текст в WizardPage. Я использую следующий фрагмент кода, чтобы создать обернутый ярлык:Обтекание текста в Eclipse Wizard

@Override 
public void createControl(Composite parent) 
{ 
    initializeDialogUnits(parent); 
    Composite composite = new Composite(parent, SWT.NONE); 
    composite.setFont(parent.getFont()); 
    composite.setLayout(initGridLayout(new GridLayout(3, false), true)); 
    composite.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false)); 

    Label l = new Label(composite, SWT.WRAP); 
    l.setText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut" 
        + "labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo" 
        + "duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum" 
        + "dolor sit amet."); 
    l.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false, 3, 1)); 

    // create other components 

    setControl(composite); 
} 

Как мастер показывает вверх, он пытается поставить весь текст в одной строке, и его окно занимает столько же места, сколько ему нужно. Я думаю, вы можете себе представить, как это выглядит. Я получаю желаемый результат, если вручную изменю размер окна до его первоначального размера, то есть размер, который будет иметь, если не будет метки. Есть ли хорошая практика для достижения этого?

enter image description here

ответ

0

Вы можете установить атрибут экземпляра GridDatawidthHint. Это не идеальное решение, но, возможно, это помогает:

Label l = new Label(composite, SWT.WRAP); 
l.setText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut" 
       + "labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo" 
       + "duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum" 
       + "dolor sit amet."); 
GridData gd = new GridData(SWT.FILL, SWT.NONE, true, false, 3, 1); 
l.setLayoutData(gd); 

Если вы не установите атрибут статического значения widthHint, единственный способ, которым я понял, это переопределить setVisible метод DialogPage. Если вы это сделаете, вам нужно сохранить экземпляр метки в качестве переменной-члена в классе.

@Override 
public void setVisible(boolean visible) { 
    int widthHint = getControl().getSize().x - 16; 

    l.setText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut" 
       + "labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo" 
       + "duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum" 
       + "dolor sit amet."); 
    ((GridData)l.getLayoutData()).widthHint = widthHint; 

    getControl().pack(); 

    super.setVisible(visible); 
} 

Надеюсь, что это поможет.

+0

Чтобы установить правильное разрешение независимо 'widthHint', мне нужно знать ширину окна мастера, которая может быть определена только после создания окна. Поэтому я предполагаю, что мне придется поймать 'SWT.MeasureItem' или переопределить' setVisible', чтобы получить размер окна и установить соответствующий 'widthHint'. Правильно? –

+0

Событие SWT.MeasureItem не работает для меня. Единственный способ - переопределить метод 'setVisible'' DialogPage'. См. Мой обновленный ответ. – DirkNM

+0

Кажется хорошо работать. Тем не менее, существует постоянная разница между композицией и границей окна, которую мне пришлось установить для 22 для реального текста. Но я думаю, что я должен выдержать это, так как я понятия не имею, как его определить. –

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