如何计算SWT中每列占用的宽度

时间:2014-05-20 09:28:15

标签: java layout swt

是否可以计算SWT中每个窗框列占用的宽度? 我只能得到每列的权重。我们可以用像素计算宽度,而不是用任何方法吗?

1 个答案:

答案 0 :(得分:1)

好吧,我想出了一个解决方案。它不是像素完美的,但应该给你一个很好的起点。

这个想法是基于总宽度和重量基本计算个别宽度。关键部分是我使用Math.round(),在最坏的情况下会导致+ -1像素错误。

然而,这里是:

public static void main(String[] args)
{
    final Display display = new Display();
    Shell shell = new Shell(display);
    shell.setText("StackOverflow");
    shell.setLayout(new FillLayout(SWT.VERTICAL));

    final SashForm sashForm = new SashForm(shell, SWT.HORIZONTAL);

    Text text = new Text(sashForm, SWT.CENTER);
    text.setText("Text in pane #1");
    text = new Text(sashForm, SWT.CENTER);
    text.setText("Text in pane #2");
    text = new Text(sashForm, SWT.CENTER);
    text.setText("Text in pane #3");

    sashForm.setWeights(new int[] { 1, 2, 3 });

    Button button = new Button(shell, SWT.PUSH);
    button.setText("Get width");
    button.addListener(SWT.Selection, new Listener()
    {
        @Override
        public void handleEvent(Event arg0)
        {
            int overallWidth = sashForm.getClientArea().width;
            int[] widths = new int[sashForm.getSashWidth()];

            int overallWeight = 0;

            for (int i : sashForm.getWeights())
            {
                overallWeight += i;
            }

            for (int i = 0; i < widths.length; i++)
            {
                widths[i] = Math.round(overallWidth * (1f * sashForm.getWeights()[i] / overallWeight));
            }

            System.out.println(Arrays.toString(widths));
        }
    });

    shell.pack();
    shell.open();
    while (!shell.isDisposed())
    {
        while (!display.readAndDispatch())
        {
            display.sleep();
        }
    }
}