Java ScrolledComposite中的SWT GridLayout弄乱了组件的大小
我有一个窗口,它必须显示一个按钮列表,每个按钮都在下面。 所有按钮必须是特定大小的正方形(运行时大小可能会改变) 这个简单的例子显示了所有的按钮Java ScrolledComposite中的SWT GridLayout弄乱了组件的大小,java,swt,Java,Swt,我有一个窗口,它必须显示一个按钮列表,每个按钮都在下面。 所有按钮必须是特定大小的正方形(运行时大小可能会改变) 这个简单的例子显示了所有的按钮 public class Main { public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(n
public class Main
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
val scrollPanel = new ScrolledComposite(shell, SWT.V_SCROLL);
scrollPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
scrollPanel.setLayout(new FillLayout());
val gridPanel = new Composite(scrollPanel, SWT.NONE);
val gridLayout = new GridLayout(1, false);
gridPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
gridPanel.setLayout(gridLayout);
scrollPanel.setContent(gridPanel);
val blue = display.getSystemColor(SWT.COLOR_BLUE);
val red = display.getSystemColor(SWT.COLOR_RED);
scrollPanel.setBackground(blue);
gridPanel.setBackground(red);
val exitButton = new Button(gridPanel, SWT.PUSH);
exitButton.setText("Exit");
exitButton.addListener(SWT.Selection, touchEvent -> shell.dispose());
for (int i = 1; i <= 10; i++)
{
val button = new Button(gridPanel, SWT.PUSH);
button.setText("Item: " + i);
button.setSize(60, 60);
gridPanel.setSize(gridPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
}
shell.setSize(100, 700);
shell.open();
while (!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();
display.dispose();
}
}
公共类主
{
公共静态void main(字符串[]args)
{
显示=新显示();
外壳=新外壳(显示);
setLayout(新的FillLayout());
val scrollPanel=新的ScrolledComposite(shell,SWT.V_SCROLL);
setLayoutData(新的GridData(SWT.FILL,SWT.FILL,true,true));
scrollPanel.setLayout(新的FillLayout());
val gridPanel=新组合(scrollPanel,SWT.NONE);
val gridLayout=新的gridLayout(1,false);
setLayoutData(新的GridData(SWT.FILL,SWT.FILL,true,true));
设置布局(gridLayout);
scrollPanel.setContent(gridPanel);
val blue=display.getSystemColor(SWT.COLOR_blue);
val red=display.getSystemColor(SWT.COLOR\u red);
滚动面板。立根背景(蓝色);
网格面板。立根背景(红色);
val exitButton=新按钮(网格面板,SWT.PUSH);
setText(“退出”);
addListener(SWT.Selection,touchEvent->shell.dispose());
对于(int i=1;i如果使用布局(您应该使用),则不得使用setSize()
或以其他方式干扰布局
使用GridData
的widthHint
和heightHint
来控制按钮的大小
public class Main
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
val scrollPanel = new ScrolledComposite(shell, SWT.V_SCROLL);
scrollPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
scrollPanel.setLayout(new FillLayout());
val gridPanel = new Composite(scrollPanel, SWT.NONE);
val gridLayout = new GridLayout(1, false);
gridPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
gridPanel.setLayout(gridLayout);
scrollPanel.setContent(gridPanel);
val blue = display.getSystemColor(SWT.COLOR_BLUE);
val red = display.getSystemColor(SWT.COLOR_RED);
scrollPanel.setBackground(blue);
gridPanel.setBackground(red);
val exitButton = new Button(gridPanel, SWT.PUSH);
exitButton.setText("Exit");
exitButton.addListener(SWT.Selection, touchEvent -> shell.dispose());
for (int i = 1; i <= 10; i++)
{
val button = new Button(gridPanel, SWT.PUSH);
button.setText("Item: " + i);
button.setSize(60, 60);
gridPanel.setSize(gridPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
}
shell.setSize(100, 700);
shell.open();
while (!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();
display.dispose();
}
}
例如:
GridData gridData = new GridData( SWT.BEGINNING, SWT.CENTER, false, false );
gridData.widthHint = 60;
gridData.heightHint = 60;
button.setLayoutData( gridData );
Button button = new Button(gridPanel, SWT.PUSH);
button.setText("Item: " + i);
GridData buttonLayoutData = new GridData();
buttonLayoutData.widthHint = 60;
buttonLayoutData.heightHint = 60;
button.setLayoutData(buttonLayoutData);
首先,setSize
只有在不使用布局(绝对定位)时才能正常工作
如果您使用的是布局,它将根据布局本身以及您定义组件布局数据的方式自动设置组件大小
通常,强烈建议使用布局而不是绝对定位
在GridLayout
的情况下,您可以通过widthHint
和heightHint
在其GridData
中指定组件尺寸,例如:
GridData gridData = new GridData( SWT.BEGINNING, SWT.CENTER, false, false );
gridData.widthHint = 60;
gridData.heightHint = 60;
button.setLayoutData( gridData );
Button button = new Button(gridPanel, SWT.PUSH);
button.setText("Item: " + i);
GridData buttonLayoutData = new GridData();
buttonLayoutData.widthHint = 60;
buttonLayoutData.heightHint = 60;
button.setLayoutData(buttonLayoutData);
其他意见:
- 要使ScrollComposite正常工作,应添加以下行:
scrollPanel.setExpandHorizontal(true);
scrollPanel.setExpandVertical(true);
scrollPanel.setMinSize(gridPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
特别是,setMinSize
将告诉ScrollComposite
滚动条的显示大小
- 如果父布局是一个
FillLayout
,则不应在其子布局上设置布局数据。它不会做任何事情,因为它不是预期的。因此,您应该从scrollPanel
和gridPanel
中删除setLayoutData
- 如果您想在稍后更改按钮大小,只需获取其布局数据,修改提示并要求组件进行布局(也不要忘记使用
setMinSize
)将更改通知滚动条):
删除/替换FillLayout还是从scroll-/grid面板中删除布局数据更好?我将FillLayout放在shell和scrollPanel上,因为当时没有显示任何内容……我非常绝望:只有当父布局是GridLayout
时才需要DGridData
。如果您只想填充内容l所有可用空间,则FillLayout
是最佳选择。它似乎适合您的情况。