스크롤 된 콤포지트 안에 확장 막대가있는 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 오류가 발생합니다. 누군가 나를 도울 수 있기를 바랍니다.
당신은 아마도'ScrolledComposite'의 최소 매개 변수를 업데이트해야합니다. – Baz
나는 이것을 시도했지만 아무 일도 일어나지 않았다. 또한 정상적인 크기를 조정하려고 scrolled.setSize (bar.computeSize (SWT.DEFAULT, SWT.DEFAULT)) 아니 행운이 – user1997322
어쩌면 당신이 [최소, 완료, 테스트 및 읽을 수있는 예제를 만들 수 있습니다 (http : // stackoverflow. co.kr/help/mcve)? 테스트 할 코드가 없다면 어떤 일이 일어나는지 파악하는 것이 항상 어렵습니다. – Baz