Java 在ScrolledComposite中调整expandbar SWT的大小
我正在构建一个JavaSWT独立应用程序,在scrolledcomposite中有一个expandbar。在某个时刻,我将向其中一个组件添加一个字段。因此,项目的大小将增加。首先,我销毁expandbar中的所有当前项:Java 在ScrolledComposite中调整expandbar SWT的大小,java,swt,scrolledcomposite,Java,Swt,Scrolledcomposite,我正在构建一个JavaSWT独立应用程序,在scrolledcomposite中有一个expandbar。在某个时刻,我将向其中一个组件添加一个字段。因此,项目的大小将增加。首先,我销毁expandbar中的所有当前项: public void closeAll(){ for(int a = bar.getItemCount()-1; a>=0; a--){ bar.getItem(a).getControl().dispose(); bar.ge
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);
}
更新
我为自己的问题树立了一个更好的榜样。此代码正在运行并为我生成相同的错误:
(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
}
import org.eclipse.swt.swt;
导入org.eclipse.swt.custom.CTabFolder;
导入org.eclipse.swt.custom.CTabItem;
导入org.eclipse.swt.custom.SashForm;
导入org.eclipse.swt.custom.ScrolledComposite;
导入org.eclipse.swt.events.SelectionEvent;
导入org.eclipse.swt.events.SelectionListener;
导入org.eclipse.swt.layout.FillLayout;
导入org.eclipse.swt.layout.GridData;
导入org.eclipse.swt.layout.GridLayout;
导入org.eclipse.swt.widgets.Button;
导入org.eclipse.swt.widgets.Composite;
导入org.eclipse.swt.widgets.Display;
导入org.eclipse.swt.widgets.ExpandBar;
导入org.eclipse.swt.widgets.ExpandItem;
导入org.eclipse.swt.widgets.Label;
导入org.eclipse.swt.widgets.Shell;
公共类ExpandBarExample实现SelectionListener{
公共静态void main(字符串[]args){
显示=新显示();
外壳=新外壳(显示);
新样本(外壳);
shell.setMaximized(true);
setLayout(新的FillLayout());
shell.open();
而(!shell.isDisposed()){
如果(!display.readAndDispatch()){
display.sleep();
}
}
display.dispose();
}
私人酒吧;
私人卷轴复合卷轴;
私人复合材料;
私人窗扇;
专用CTabFolder文件夹;
私人按钮;
公共扩展示例(复合){
这个。复合=复合;
init();
}
公共void init(){
setLayout(新的FillLayout());
窗扇=新窗扇形式(复合,SWT.垂直);
文件夹=新CTabFolder(sash,SWT.None);
scroll=新的ScrolledComposite(文件夹,SWT.V_scroll);
GridData=新的GridData();
data.grabExcessHorizontalSpace=true;
data.grabExcessVerticalSpace=true;
bar=新的ExpandBar(滚动,SWT.NONE);
滚动。设置内容(条);
scroll.setExpandVertical(true);
scroll.setExpandHorizontal(true);
scroll.setAlwaysShowScrollBars(true);
CTabItem选项卡=新的CTabItem(文件夹,SWT.None);
tab.设置控件(滚动);
tab.setText(“测试”);
复合窗扇填充=新复合材料(窗扇、SWT.边框);
sashFill.setLayout(新的FillLayout());
按钮=新按钮(窗扇填充、SWT.按钮);
按钮。addSelectionListener(此);
setText(“添加块”);
sash.setWeights(新的int[]{3,1});
对于(inta=0;a好的,我找到了一个解决方法。它不是解决问题的解决方案,而是避免问题的方法
您的问题似乎是由扩展ExpandItem
时发生的延迟引起的。因此,您的代码更新最小尺寸时使用了未扩展的尺寸。在设置最小尺寸之前添加延迟可以解决您的问题。尝试使用延迟值,但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);
}
});
}
publicstaticvoidmain(字符串[]args)
{
显示=新显示();
外壳=新外壳(显示);
新样本(外壳);
shell.setMaximized(true);
setLayout(新的FillLayout());
shell.open();
而(!shell.isDisposed())
{
如果(!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
}
私人酒吧;
私人卷轴复合卷轴;
私人复合材料;
私人窗扇;
专用CTabFolder文件夹;
私人按钮;
公共扩展示例(复合)
{
这个。复合=复合;
init();
}
公共void init()
{
setLayout(新的FillLayout());
窗扇=新窗扇形式(复合,SWT.垂直);
文件夹=新CTabFolder(sash,SWT.None);
scroll=新的ScrolledComposite(文件夹,SWT.V_scroll);
GridData=新的GridData();
data.grabExcessHorizontalSpace=true;
data.grabExcessVerticalSpace=true;
bar=新的ExpandBar(滚动,SWT.NONE);
滚动。设置内容(条);
scroll.setExpandVertical(true);
scroll.setExpandHorizontal(true);
scroll.setAlwaysShowScrollBars(true);
CTabItem选项卡=新的CTabItem(文件夹,SWT.None);
tab.设置控件(滚动);
tab.setText(“测试”);
复合窗扇填充=新复合材料(窗扇、SWT.边框);
sashFill.setLayout(新的FillLayout());
按钮=新按钮(窗扇填充、SWT.按钮);
addListener(SWT.Selection,newlistener())
{
@凌驾
公共无效handleEvent(事件arg0)
{
复合材料=新复合材料(棒材、SWT.边框);
组件设置布局(新网格布局(2,错误));
对于(int a=0;a<10;a++)
{
标签=新标签(组件、SWT.边框);
label.setText(“测试”);
}
组件布局(真实);
附加条款(公司,“增加”);
scroll.setMinSize(bar.computeSize(SWT.DEFAULT,SWT.DEFAULT,true));
滚动布局(true,true);
}
});
setText(“添加块”);
sash.setWeights(新的int[]{3,1});
scroll.setMinSize(bar.computeSize(SWT.DEFAULT,SWT.DEFAULT));
滚动布局(true);
}
公共无效刷新()
{
}
公共无效删除所有()
{
ExpandItem[]items=bar.getItems();
系统输出打印项次(项目长度);
对于(int a=items.length-1;a>=0;a--)
{
项[a].getControl().dispose();
项目[a].dispose();
}
}
public void addItem(复合,字符串tabName)
{
最终扩展项扩展项
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
}
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);
}
});
}
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));
}
});
}
});