2014-01-29 1 views
1

스크롤 된 콤포지트 안에 확장 막대가있는 Java SWT 독립 실행 형 응용 프로그램을 빌드 중입니다. 어떤 시점에서 하나의 구성 요소에 필드를 추가합니다. 따라서 항목의 크기가 커집니다. 우선은 현재의 모든 상품 expandbar 내부 파괴 : ScrollledComposite의 expandbar SWT 크기 조정

public void closeAll(){ 
    for(int a = bar.getItemCount()-1; a>=0; a--){ 
     bar.getItem(a).getControl().dispose(); 
     bar.getItem(a).dispose(); 
    } 
} 

그럼 내가 다시 그들 모두를 다시 추가합니다 (내가 다른 곳에 저장되어있는 복합이). 그리고 난 각 항목의 높이를 재 계산 :

for(int a = 0; a<bar.getItemCount(); a++){ 
     bar.getItem(a).setHeight(bar.getItem(a).getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT).y); 

    } 

을 그리고 난이 모든 작업을 수행 할 때 스크롤 복합은 더 아래합니다 (expandbar의 일부가 ScrolledComposite의 클라이언트 영역 밖에 지금) 스크롤되지 않습니다.

창 크기를 조정할 때 모든 문제가 해결됩니다. 그렇다면이 업데이트는 일반적으로 코드없이 윈도우의 크기를 조정할 때 강제로 적용 할 수 있습니까?

미리 감사드립니다.

는 // 내가 얘기하고있는 클래스를 추가 한

편집 :

내가 예를 만들려고
public class InputPanel extends Panel implements Refresh{ 

private Editor parent; 
private ExpandBar expandBar; 

private ArrayList<InputBlock> blocks; 
public ScrolledComposite scroll; 



public InputPanel(Editor parent, Composite panel) { 
    super(panel); 
    this.parent = parent; 
    setGridLayout(0,0,1); 
    blocks = new ArrayList<InputBlock>(); 
    init(); 
} 
private void init(){ 
    //two pannels first button pannel 
    Panel buttonPanel = new Panel(new Composite(panel, SWT.BORDER)); 
    buttonPanel.setGridLayout(0, 0, 3); 
    buttonPanel.fillGridData(); 

    Composite barComp = new Composite(panel, SWT.BORDER); 

    barComp.setLayout(new FillLayout()); 
    GridData data1 = new GridData(); 
    data1.grabExcessHorizontalSpace = true; 
    data1.horizontalAlignment = SWT.FILL; 
    data1.verticalAlignment = SWT.FILL; 
    barComp.setLayoutData(data1); 

    scroll = new ScrolledComposite(barComp, SWT.V_SCROLL); 
    expandBar = new ExpandBar(scroll, SWT.None); 
    GridData data = new GridData(); 
    data.grabExcessHorizontalSpace = true; 
    data.grabExcessVerticalSpace = true; 
    data.horizontalAlignment = SWT.FILL; 
    data.verticalAlignment = SWT.TOP; 

    scroll.setContent(expandBar); 
    scroll.setExpandVertical(true); 
    scroll.setExpandHorizontal(true); 
    scroll.setAlwaysShowScrollBars(true); 
    for(int a = 0; a<Main.database.size(); a++){ 
     Composite composite = new Composite(expandBar, SWT.BORDER); 
     blocks.add(new InputBlock(this, composite, Main.database.get(a))); 
     addItem(composite, Main.database.get(a).name); 
    } 
    refreshHeights(); 
    scroll.setMinSize(expandBar.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
    scroll.layout(true); 
} 
public void addItem(Composite composite, String tabName){ 
    ExpandItem expandItem = new ExpandItem(expandBar, SWT.None); 
    expandItem.setText(tabName); 
    expandItem.setControl(composite); 
    expandItem.setExpanded(true); 
    composite.setVisible(true); 
} 
public void refreshHeights(){ 
    for(int a = 0; a<expandBar.getItemCount(); a++){ 
     expandBar.getItem(a).setHeight(expandBar.getItem(a).getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT).y); 
    } 

} 
public void closeAll(){ 
    ExpandItem[] items = expandBar.getItems(); 
    System.out.println(items.length); 

    for(int a = items.length-1; a>=0; a--){ 
     items[a].getControl().dispose(); 
     items[a].dispose(); 
    } 
} 


public void refresh(){ 
    closeAll(); 
    blocks = new ArrayList<InputBlock>(); 
    for(int a = 0; a<Main.database.size(); a++){ 
     Composite composite = new Composite(expandBar, SWT.BORDER); 
     blocks.add(new InputBlock(this, composite, Main.database.get(a))); 
     addItem(composite, Main.database.get(a).name); 
    } 
    refreshHeights(); 
    scroll.setMinSize(expandBar.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
    scroll.layout(true); 
} 

public Editor getParent(){ 
    return parent; 
} 


public void setEditorMenu(boolean show){ 
    for(int a = 0; a<blocks.size(); a++){ 
     blocks.get(a).setEditorMenu(show); 
    } 
} 



public ArrayList<InputBlock> getBlocks(){ 
    return blocks; 
} 
public boolean setValue(DatabaseField field, String value){ 
    value = value.trim(); 
    for(int a = 0; a<blocks.size(); a++){ 
     if(blocks.get(a).setValue(field, value)){ 
      return true; 
     } 
    } 
    return false; 
} 

}

그러나 예는 상자 밖으로했다. 나는 그 차이가 무엇인지 알 수 없다. InputBlocks는 복합체에 필요한 필드에 대한 데이터를 보유하는 클래스이며, 호출되면 복합체를 생성합니다.

ScrolledComposite를 보유하고있는 합성물은 현재 SashForm으로되어 있습니다. 이것이 어떤 변화를 가져올 지 모르겠습니다.

와 나는 (리눅스에서만)이 오류가 있지만 예에서 내가 시도 :

SWT:12455): Gtk-CRITICAL **: IA__gtk_widget_map: assertion `gtk_widget_get_visible (widget)' failed 
(SWT:12455): Gtk-CRITICAL **: IA__gtk_widget_map: assertion `gtk_widget_get_visible (widget)' failed 
(SWT:12455): Gtk-CRITICAL **: IA__gtk_widget_map: assertion `gtk_widget_get_visible (widget)' failed 

UPDATE

나는 내 문제의 더 나은 예를했다. 이 코드는 실행하고 나를 위해 동일한 오류를 생성 :

(SWT:6765): Gtk-CRITICAL **: IA__gtk_widget_map: assertion `gtk_widget_get_visible (widget)' failed 

나는이 코드를 사용했습니다 :

import org.eclipse.swt.SWT; 
import org.eclipse.swt.custom.CTabFolder; 
import org.eclipse.swt.custom.CTabItem; 
import org.eclipse.swt.custom.SashForm; 
import org.eclipse.swt.custom.ScrolledComposite; 
import org.eclipse.swt.events.SelectionEvent; 
import org.eclipse.swt.events.SelectionListener; 
import org.eclipse.swt.layout.FillLayout; 
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.Display; 
import org.eclipse.swt.widgets.ExpandBar; 
import org.eclipse.swt.widgets.ExpandItem; 
import org.eclipse.swt.widgets.Label; 
import org.eclipse.swt.widgets.Shell; 


public class ExpandBarExample implements SelectionListener{ 



public static void main(String[] args){ 
    Display display = new Display(); 
    Shell shell = new Shell(display); 
    new ExpandBarExample(shell); 
    shell.setMaximized(true); 
    shell.setLayout(new FillLayout()); 
    shell.open(); 

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

private ExpandBar bar; 
private ScrolledComposite scroll; 
private Composite composite; 
private SashForm sash; 
private CTabFolder folder; 
private Button button; 

public ExpandBarExample(Composite composite){ 
    this.composite = composite; 

    init(); 
} 
public void init(){ 


    composite.setLayout(new FillLayout()); 
    sash = new SashForm(composite, SWT.VERTICAL); 

    folder = new CTabFolder(sash, SWT.None); 


    scroll = new ScrolledComposite(folder, SWT.V_SCROLL); 
    GridData data = new GridData(); 
    data.grabExcessHorizontalSpace = true; 
    data.grabExcessVerticalSpace = true; 

    bar = new ExpandBar(scroll, SWT.NONE); 
    scroll.setContent(bar); 
    scroll.setExpandVertical(true); 
    scroll.setExpandHorizontal(true); 
    scroll.setAlwaysShowScrollBars(true); 



    CTabItem tab = new CTabItem(folder, SWT.None); 
    tab.setControl(scroll); 
    tab.setText("TEST"); 

    Composite sashFill = new Composite(sash, SWT.BORDER); 
    sashFill.setLayout(new FillLayout()); 
    button = new Button(sashFill, SWT.PUSH); 
    button.addSelectionListener(this); 
    button.setText("Add block"); 

    sash.setWeights(new int[]{3,1}); 

    for(int a = 0; a<10; a++){ 
     Composite composite = new Composite(bar, SWT.BORDER); 

     composite.setLayout(new GridLayout(2, false)); 

     for(int b = 0; b<10; b++){ 
      Label label = new Label(composite, SWT.BORDER); 
      label.setText("TEST"); 
     } 

     addItem(composite, "Item " + a); 
    } 
    computeHeights(); 
    scroll.setMinSize(bar.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
    scroll.layout(true); 



    //delete old panels 
    removeAll(); 
    //trying to add more panels 

    for(int a = 0; a<10; a++){ 
     Composite composite = new Composite(bar, SWT.BORDER); 


     composite.setLayout(new GridLayout(2, false)); 

     for(int b = 0; b<20; b++){ 
      Label label = new Label(composite, SWT.BORDER); 
      label.setText("TEST"); 
     } 

     addItem(composite, "Item " + a); 
    } 


    computeHeights(); 
    scroll.setMinSize(bar.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
    scroll.layout(true); 

} 
public void refresh(){ 

} 
public void removeAll(){ 
    ExpandItem[] items = bar.getItems(); 
    System.out.println(items.length); 

    for(int a = items.length-1; a>=0; a--){ 
     items[a].getControl().dispose(); 
     items[a].dispose(); 
    } 
} 
public void addItem(Composite composite, String tabName){ 
    ExpandItem expandItem = new ExpandItem(bar, SWT.None); 
    expandItem.setText(tabName); 
    expandItem.setControl(composite); 
    expandItem.setExpanded(true); 
} 
public void computeHeights(){ 
    for(int a = 0; a<bar.getItemCount(); a++){ 
     bar.getItem(a).setHeight(bar.getItem(a).getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT).y); 
    } 
} 
@Override 
public void widgetSelected(SelectionEvent e) { 
    if(e.getSource() == button){ 
     Composite comp = new Composite(bar, SWT.BORDER); 
     comp.setLayout(new GridLayout(2, false)); 
     for(int a = 0; a<10; a++){ 
      Label label = new Label(comp, SWT.BORDER); 
      label.setText("TEST"); 
     } 
     comp.layout(true); 
     addItem(comp, "ADDED"); 
     computeHeights(); 

     scroll.setMinSize(bar.computeSize(SWT.DEFAULT, SWT.DEFAULT, true)); 

     scroll.layout(true, true); 
    } 

} 
@Override 
public void widgetDefaultSelected(SelectionEvent e) { 
    // TODO Auto-generated method stub 

} 

}

나는 우분투와 오픈 수세에서이 작업을 실행하는 시도를 모두 동일한 Gtk 오류가 발생합니다. 누군가 나를 도울 수 있기를 바랍니다.

+0

당신은 아마도'ScrolledComposite'의 최소 매개 변수를 업데이트해야합니다. – Baz

+0

나는 이것을 시도했지만 아무 일도 일어나지 않았다. 또한 정상적인 크기를 조정하려고 scrolled.setSize (bar.computeSize (SWT.DEFAULT, SWT.DEFAULT)) 아니 행운이 – user1997322

+0

어쩌면 당신이 [최소, 완료, 테스트 및 읽을 수있는 예제를 만들 수 있습니다 (http : // stackoverflow. co.kr/help/mcve)? 테스트 할 코드가 없다면 어떤 일이 일어나는지 파악하는 것이 항상 어렵습니다. – Baz

답변

0

그래, 해결 방법을 찾았습니다. 문제를 해결하는 솔루션이 아니라 문제를 해결하는 솔루션입니다.

ExpandItem을 확장 할 때 발생하는 지연으로 인해 문제가 발생한 것으로 보입니다. 결과적으로 minSize를 업데이트하는 코드는 확장되지 않은 크기를 사용합니다. minSize를 설정하기 전에 지연을 추가하면 문제가 해결됩니다. 지연 값 장난 시도하지만,이 300ms가 잘 작동하는 것 같군 정말 사용성을 방해하지 않습니다

public static void main(String[] args) 
{ 
    Display display = new Display(); 
    Shell shell = new Shell(display); 
    new ExpandBarExample(shell); 
    shell.setMaximized(true); 
    shell.setLayout(new FillLayout()); 
    shell.open(); 

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

private ExpandBar   bar; 
private ScrolledComposite scroll; 
private Composite   composite; 
private SashForm   sash; 
private CTabFolder   folder; 
private Button    button; 

public ExpandBarExample(Composite composite) 
{ 
    this.composite = composite; 

    init(); 
} 

public void init() 
{ 

    composite.setLayout(new FillLayout()); 
    sash = new SashForm(composite, SWT.VERTICAL); 

    folder = new CTabFolder(sash, SWT.None); 

    scroll = new ScrolledComposite(folder, SWT.V_SCROLL); 
    GridData data = new GridData(); 
    data.grabExcessHorizontalSpace = true; 
    data.grabExcessVerticalSpace = true; 

    bar = new ExpandBar(scroll, SWT.NONE); 
    scroll.setContent(bar); 
    scroll.setExpandVertical(true); 
    scroll.setExpandHorizontal(true); 
    scroll.setAlwaysShowScrollBars(true); 

    CTabItem tab = new CTabItem(folder, SWT.None); 
    tab.setControl(scroll); 
    tab.setText("TEST"); 

    Composite sashFill = new Composite(sash, SWT.BORDER); 
    sashFill.setLayout(new FillLayout()); 
    button = new Button(sashFill, SWT.PUSH); 
    button.addListener(SWT.Selection, new Listener() 
    { 
     @Override 
     public void handleEvent(Event arg0) 
     { 
      Composite comp = new Composite(bar, SWT.BORDER); 
      comp.setLayout(new GridLayout(2, false)); 
      for (int a = 0; a < 10; a++) 
      { 
       Label label = new Label(comp, SWT.BORDER); 
       label.setText("TEST"); 
      } 
      comp.layout(true); 
      addItem(comp, "ADDED"); 

      scroll.setMinSize(bar.computeSize(SWT.DEFAULT, SWT.DEFAULT, true)); 
      scroll.layout(true, true); 
     } 
    }); 
    button.setText("Add block"); 

    sash.setWeights(new int[] { 3, 1 }); 

    scroll.setMinSize(bar.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
    scroll.layout(true); 
} 

public void refresh() 
{ 

} 

public void removeAll() 
{ 
    ExpandItem[] items = bar.getItems(); 
    System.out.println(items.length); 

    for (int a = items.length - 1; a >= 0; a--) 
    { 
     items[a].getControl().dispose(); 
     items[a].dispose(); 
    } 
} 

public void addItem(Composite composite, String tabName) 
{ 
    final ExpandItem expandItem = new ExpandItem(bar, SWT.None); 
    expandItem.setText(tabName); 
    expandItem.setControl(composite); 
    expandItem.setExpanded(true); 
    expandItem.setHeight(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y); 

    Display.getDefault().timerExec(300, new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      scroll.setMinSize(bar.computeSize(SWT.DEFAULT, SWT.DEFAULT, true)); 
      scroll.layout(true, true); 
     } 
    }); 
} 
+0

expandItem을 추가 한 후에 스크롤하지 않은 scoll이있는 버그를 겪고있는 사람들에게도 해결 될 것이다! Baz 감사합니다! – user1997322

+0

@ user1997322 기꺼이 도와 드리겠습니다! – Baz

1

사실 일 MS는 항상 충분하다!`,`scrolled.setMinSize (bar.computeSize (SWT.DEFAULT, SWT.DEFAULT)) :

expandBar.addExpandListener(new ExpandAdapter() { 
     @Override 
     public void itemExpanded(ExpandEvent e) { 
      resetScrolledCompositeMinSize(); 
     } 
     @Override 
     public void itemCollapsed(ExpandEvent e) { 
      resetScrolledCompositeMinSize(); 
     } 
     private void resetScrolledCompositeMinSize() { 
      Display.getDefault().timerExec(1, new Runnable() //1 ms is more than enough!! 
      { 
       @Override 
       public void run() 
       { 
        scrolledComposite.setMinSize(expandBar.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
       } 
      }); 
     } 
    }); 
관련 문제