我的应用程序有一个带有两个孩子的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/

10-10 04:21