2017-10-26 7 views
0

다음 코드에서 세 가지 표시 목록 단추 중 하나를 클릭하면 먼저 복합 레이블에있는 모든 레이블을 삭제 한 다음 문자열 목록의 각 행에 대한 레이블을 만듭니다.처분 및 재 작성 후 SWT 레이블이 표시되지 않음

동일한 버튼을 두 번 클릭하면 텍스트가 모두 분산됩니다.

다른 단추 중 하나로 전환하면 텍스트가 표시됩니다.

코드는 매번 동일한 작업을 수행하여 복합체 안의 모든 레이블을 처리 한 다음 새 레이블을 복합체에 추가합니다. 정확히 같은 내용의 레이블을 복합체에 다시 추가하면 어떤 이유로 화면에 더 이상 표시하지 않습니다.

content.layout(); 

를 호출

import java.util.ArrayList; 
import java.util.List; 

import org.eclipse.jface.dialogs.Dialog; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.SelectionAdapter; 
import org.eclipse.swt.events.SelectionEvent; 
import org.eclipse.swt.graphics.Point; 
import org.eclipse.swt.layout.GridData; 
import org.eclipse.swt.layout.GridLayout; 
import org.eclipse.swt.widgets.Button; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Control; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Label; 
import org.eclipse.swt.widgets.Shell; 

public class BasicMapLabelTestDialog extends Dialog 
{ 
    List<Label> displaylabels = new ArrayList<>(); 
    Composite content, list; 

    public BasicMapLabelTestDialog(Shell parentShell) 
    { 
     super(parentShell); 
    } 

    @Override 
    protected void configureShell(Shell shell) 
    { 
     super.configureShell(shell); 
     shell.setSize(new Point(700, 500)); 
     shell.setText("FML"); //$NON-NLS-1$ 
    } 

    @Override 
    public Control createDialogArea(final Composite comp) 
    { 
     content = (Composite) super.createDialogArea(comp); 
     content.setLayout(new GridLayout(1, false)); 
     content.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 


     final List<String> rows1 = new ArrayList<>(3); 
     rows1.add("Hello"); 
     rows1.add("Baz"); 
     rows1.add("Please"); 
     rows1.add("Help"); 

     final List<String> rows2 = new ArrayList<>(3); 
     rows2.add("You're"); 
     rows2.add("My"); 
     rows2.add("Only"); 
     rows2.add("Hope"); 


     final List<String> rows3 = new ArrayList<>(3); 
     rows3.add("Or"); 
     rows3.add("Maybe"); 
     rows3.add("greg?"); 



     Button set1 = new Button(content, SWT.PUSH); 
     set1.setText("Display List 1"); 
     set1.addSelectionListener(new SelectionAdapter() { 

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


     Button set2 = new Button(content, SWT.PUSH); 
     set2.setText("Display List 2");   
     set2.addSelectionListener(new SelectionAdapter() { 

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

     Button set3 = new Button(content, SWT.PUSH); 
     set3.setText("Display List 3");   
     set3.addSelectionListener(new SelectionAdapter() { 

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


     Button test = new Button(content, SWT.PUSH); 
     test.setText("Print Label Content");   
     test.addSelectionListener(new SelectionAdapter() { 

      @Override 
      public void widgetSelected(SelectionEvent e) { 
       for (Label l : displaylabels) { 
        System.out.println(l.getText()); 
       } 
      } 
     }); 



     list = new Composite(content, SWT.NONE); 
     list.setLayout(new GridLayout(1, true)); 
     new Label(content, SWT.HORIZONTAL | SWT.SEPARATOR); 


     return content; 
    } 

    private void updateList(List<String> rows) { 
     if (this.displaylabels == null) { 
      this.displaylabels = new ArrayList<>(); 
     } 
     for (Label l : displaylabels) { 
      l.dispose(); 
     } 
     this.displaylabels.clear(); 


     for (String item : rows) { 
      addListLabel(item); 
     } 

     content.layout(); 
     content.redraw(); 
    } 

    private void addListLabel(String whoText) { 
     Label a = new Label(list, SWT.NONE); 
     a.setText(whoText); 
     this.displaylabels.add(a); 
    } 

    public static void main(String[] args) 
    { 
     Display d = new Display(); 
     Shell s = new Shell(); 

     BasicMapLabelTestDialog fml = new BasicMapLabelTestDialog(s); 
     fml.open(); 
    } 

} 

감사합니다,

글렌 X

답변

1

여기에 전체 레이아웃을하는 것만으로는 충분하지 않습니다.

content.layout(true, true); 

으로 전화하여 모든 컨트롤을 배치해야합니다.

redraw 전화가 필요하지 않습니다.

+0

이제 목록에 처음 나왔다고 생각합니다. 대단히 고맙습니다. 그 행동은 그렇게 생각하지도 못했을 정도로 당황 스러웠습니다. – Link19