本文介绍了SWT ExpandListener在Linux崩溃之前执行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一个简单的可执行代码段,显示问题。

This is a simple executable snippet that shows the issue.

当使用ExpandBar时,所需的结果是在崩溃或展开时调整窗口大小。它在Mac上正常工作,但不在Linux上。

When using the ExpandBar the desired outcome is to resize the window when there is a collapse or expand. It works properly on Mac but does not on Linux.

在崩溃/扩展实际发生之前,调用了 ExpandListener ,因此 pack()调整大小不正确。

It looks like the ExpandListener is called before the collapse/expand actually occurs and therefore the pack() resizes incorrectly.

异步执行只是一个在Mac上工作的绷带,但这在Linux上不起作用。 / p>

The async execution is merely a bandage to have it work on Mac but this does not work on Linux.

import org.eclipse.swt.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.ExpandEvent;
import org.eclipse.swt.events.ExpandListener;

public class ExpandBarExample {
    public static void main(String[] args) {
        Shell shell = new Shell(SWT.DIALOG_TRIM | SWT.MIN
                | SWT.APPLICATION_MODAL);
        shell.setLayout(new FormLayout());
        shell.setText("Expand Bar");
        final ExpandBar bar = new ExpandBar(shell, SWT.NONE);
        FormData fd = new FormData();
        fd.top = new FormAttachment(0);
        fd.left = new FormAttachment(0);
        fd.right = new FormAttachment(100);
        fd.bottom = new FormAttachment(100);
        bar.setLayoutData(fd);

        bar.addExpandListener(new ExpandListener() {

            public void itemCollapsed(ExpandEvent arg0) {
                Display.getCurrent().asyncExec(new Runnable() {
                    public void run() {
                        bar.getShell().pack();
                    }
                });
            }

            public void itemExpanded(ExpandEvent arg0) {
                bar.getShell().pack();

                Display.getCurrent().asyncExec(new Runnable() {
                    public void run() {
                        bar.getShell().pack();
                    }
                });
            }

        });

        Composite composite = new Composite(bar, SWT.NONE);
        fd = new FormData();
        fd.left = new FormAttachment(0);
        fd.right = new FormAttachment(100);
        composite.setLayoutData(fd);

        FormLayout layout = new FormLayout();
        layout.marginLeft = layout.marginTop = layout.marginRight = layout.marginBottom = 8;

        composite.setLayout(layout);
        Label label = new Label(composite, SWT.NONE);
        label.setText("This is Bar 1");
        ExpandItem item1 = new ExpandItem(bar, SWT.NONE, 0);
        item1.setText("Bar 1");
        item1.setHeight(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
        item1.setControl(composite);
        item1.setExpanded(true);

        composite = new Composite(bar, SWT.NONE);
        fd = new FormData();
        fd.left = new FormAttachment(0);
        fd.right = new FormAttachment(100);
        composite.setLayoutData(fd);

        layout = new FormLayout();
        layout.marginLeft = layout.marginTop = layout.marginRight = layout.marginBottom = 8;
        composite.setLayout(layout);
        label = new Label(composite, SWT.NONE);
        label.setText("This is Bar2");
        ExpandItem item2 = new ExpandItem(bar, SWT.NONE, 1);
        item2.setText("Bar 2");
        item2.setHeight(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
        item2.setControl(composite);
        item2.setExpanded(true);

        composite = new Composite(bar, SWT.NONE);
        fd = new FormData();
        fd.left = new FormAttachment(0);
        fd.right = new FormAttachment(100);
        composite.setLayoutData(fd);

        layout = new FormLayout();
        layout.marginLeft = layout.marginTop = layout.marginRight = layout.marginBottom = 8;
        composite.setLayout(layout);
        label = new Label(composite, SWT.NONE);
        label.setText("This is Bar3");
        ExpandItem item3 = new ExpandItem(bar, SWT.NONE, 2);
        item3.setText("Bar 3");
        item3.setHeight(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
        item3.setControl(composite);
        item3.setExpanded(true);

        bar.setSpacing(6);
        shell.pack();
        shell.open();
        Display display = shell.getDisplay();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }

}


推荐答案

我不满意这个解决方案,但它的工作。

I am unhappy with this solution but it works.

绝对是一个解决方案

Definitely a XXX solution

b

import org.eclipse.swt.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.ExpandEvent;
import org.eclipse.swt.events.ExpandListener;

public class ExpandBarExample {
    public static void main(String[] args) {
        Shell shell = new Shell(SWT.DIALOG_TRIM | SWT.MIN
                | SWT.APPLICATION_MODAL);
        shell.setLayout(new FormLayout());
        shell.setText("Expand Bar");
        final ExpandBar bar = new ExpandBar(shell, SWT.NONE);
        FormData fd = new FormData();
        fd.top = new FormAttachment(0);
        fd.left = new FormAttachment(0);
        fd.right = new FormAttachment(100);
        fd.bottom = new FormAttachment(100);
        bar.setLayoutData(fd);

        bar.addExpandListener(new ExpandListener() {

            private void resize(final ExpandEvent event, final boolean expand){

                final Display display = Display.getCurrent();

                new Thread(new Runnable() {
                    public void run() {

                        final int[] orgSize = new int[1];
                        final int[] currentSize = new int[1];

                        final Object lock = new Object();

                        if (display.isDisposed() || bar.isDisposed()){
                            return;
                        }

                        display.syncExec(new Runnable() {
                            public void run() {
                                if (bar.isDisposed() || bar.getShell().isDisposed()){
                                    return;
                                }

                                synchronized(lock){
                                    bar.getShell().pack(true);
                                    orgSize[0] = bar.getShell().getSize().y;
                                    currentSize[0] = orgSize[0];
                                }
                            }
                        });     

                        while (currentSize[0] == orgSize[0]){
                            if (display.isDisposed() || bar.isDisposed()){
                                return;
                            }

                            display.syncExec(new Runnable() {
                                public void run() {

                                    synchronized(lock){
                                        if (bar.isDisposed() || bar.getShell().isDisposed()){
                                            return;
                                        }

                                        currentSize[0] = bar.getShell().getSize().y;

                                        if (currentSize[0] != orgSize[0]){
                                            return;
                                        }
                                        else{
                                            bar.getShell().layout(true);
                                            bar.getShell().pack(true);
                                        }
                                    }
                                }
                            });                             
                        }
                    }
                }).start();
        }

        public void itemCollapsed(ExpandEvent event) {
            resize(event, false);
        }

        public void itemExpanded(ExpandEvent event) {        
            resize(event, true);
        }

        });

        Composite composite = new Composite(bar, SWT.NONE);
        fd = new FormData();
        fd.left = new FormAttachment(0);
        fd.right = new FormAttachment(100);
        composite.setLayoutData(fd);

        FormLayout layout = new FormLayout();
        layout.marginLeft = layout.marginTop = layout.marginRight = layout.marginBottom = 8;

        composite.setLayout(layout);
        Label label = new Label(composite, SWT.NONE);
        label.setText("This is Bar 1");
        ExpandItem item1 = new ExpandItem(bar, SWT.NONE, 0);
        item1.setText("Bar 1");
        item1.setHeight(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
        item1.setControl(composite);
        item1.setExpanded(true);

        composite = new Composite(bar, SWT.NONE);
        fd = new FormData();
        fd.left = new FormAttachment(0);
        fd.right = new FormAttachment(100);
        composite.setLayoutData(fd);

        layout = new FormLayout();
        layout.marginLeft = layout.marginTop = layout.marginRight = layout.marginBottom = 8;
        composite.setLayout(layout);
        label = new Label(composite, SWT.NONE);
        label.setText("This is Bar2");
        ExpandItem item2 = new ExpandItem(bar, SWT.NONE, 1);
        item2.setText("Bar 2");
        item2.setHeight(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
        item2.setControl(composite);
        item2.setExpanded(true);

        composite = new Composite(bar, SWT.NONE);
        fd = new FormData();
        fd.left = new FormAttachment(0);
        fd.right = new FormAttachment(100);
        composite.setLayoutData(fd);

        layout = new FormLayout();
        layout.marginLeft = layout.marginTop = layout.marginRight = layout.marginBottom = 8;
        composite.setLayout(layout);
        label = new Label(composite, SWT.NONE);
        label.setText("This is Bar3");
        ExpandItem item3 = new ExpandItem(bar, SWT.NONE, 2);
        item3.setText("Bar 3");
        item3.setHeight(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
        item3.setControl(composite);
        item3.setExpanded(true);

        bar.setSpacing(6);
        shell.pack();
        shell.open();
        Display display = shell.getDisplay();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }

}

如果有人想知道这是什么正在做,不想看代码。

If anyone wants to know what this is doing and doesn't want to look at the code.

基本上, ExpandListener 查看shell的原始高度,并发出syncExec的到 pack() shell,直到shell实际上改变大小。一个非常忙碌的等待方法。

Basically the ExpandListener looks at the original height of the shell, and issues syncExec's to pack() the shell until the shell actually changes size. A very busy waiting approach.

这篇关于SWT ExpandListener在Linux崩溃之前执行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-29 15:58