2

私のアプリケーションには、2 つの子を持つ SashForm があります。ウィンドウのサイズが変更されたときに、左の子を同じサイズのままにしたい。パッケージ エクスプローラーとメイン エディターで Eclipse が行うのと同じことが必要です。ウィンドウのサイズを変更すると、テキスト エディターのサイズのみが変更されます。ただし、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] を定数に設定すると、必要なことが行われます。

4

3 に答える 3

3

問題を解決する方法のアイデアを提供する例を実行することができました。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();
}

これは次のようになります。

起動:

ここに画像の説明を入力

サイズ変更後:

ここに画像の説明を入力

両方の最小サイズを表示するには小さすぎるまでウィンドウ サイズを縮小する場合:

ここに画像の説明を入力

この例でわかるように、左側の子の最小サイズは無視され、両方の子を引き続き表示できます。

于 2013-06-21T12:45:45.117 に答える