我的应用程序有一个带有两个孩子的SashForm。我希望左孩子在调整窗口大小时保持相同的大小。我想要Eclipse使用Package Explorer和主编辑器做同样的事情。调整窗口大小时,只有文本编辑器会更改大小。但是,Package Explorer仍然可以通过腰带调整大小。
我尝试使用以下
sashForm.addControlListener(new ControlAdapter() {
@Override
public void controlResized(ControlEvent e) {
int width = sashForm.getClientArea().width;
int[] weights = sashForm.getWeights();
weights[1] = width - weights[0];
sashForm.setWeights(weights);
}
});
问题是左侧大小的宽度缩小到0或扩大太多。看起来权重在被调用之前已经更新。
如果我将weights [0]设置为等于某个常数,它将满足我的要求。
最佳答案
我设法运行了一个示例,该示例应该为您提供解决问题的思路。事实是,SashForm
使用权重而不是像素。因此,您必须根据父项大小计算左子项必须占据的百分比,然后将其余部分分配给右子项。
在我的代码示例中,您可以指定左子级的宽度并为右子级设置最小尺寸,这样SashForm
始终显示这两个值。
private static final int MIN_WIDTH_LEFT = 100;
private static final int MIN_WIDTH_RIGHT = 50;
public static void main(String[] args)
{
Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("StackOverflow");
shell.setLayout(new FillLayout());
final SashForm form = new SashForm(shell, SWT.HORIZONTAL);
Button button = new Button(form, SWT.PUSH);
button.setText("Left");
Button buttonR = new Button(form, SWT.PUSH);
buttonR.setText("Right");
form.setWeights(new int[] {1, 2});
shell.addListener(SWT.Resize, new Listener()
{
@Override
public void handleEvent(Event arg0)
{
int width = shell.getClientArea().width;
int[] weights = form.getWeights();
if(width >= MIN_WIDTH_LEFT + MIN_WIDTH_RIGHT)
{
weights[0] = 1000000 * MIN_WIDTH_LEFT / width;
weights[1] = 1000000 - weights[0];
}
else
{
weights[0] = 1000000 * MIN_WIDTH_LEFT / (MIN_WIDTH_LEFT + MIN_WIDTH_RIGHT);
weights[1] = 1000000 * MIN_WIDTH_RIGHT / (MIN_WIDTH_LEFT + MIN_WIDTH_RIGHT);
}
System.out.println(width + " " + Arrays.toString(weights));
form.setWeights(weights);
}
});
shell.pack();
shell.setSize(600, 400);
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
看起来是这样的:
启动:
调整大小后:
减小窗口大小直到太小而无法同时显示两个最小大小时:
如您所见,在这种情况下,左侧孩子的最小尺寸将被忽略,以仍然能够显示两个孩子。
关于java - 等宽SashForm,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17227086/