如何在swt中的两个复合材料之间进行通信

how to communicate between two composites in swt

我正在 SWT 中构建一个包含两个组合的应用程序,我需要在它们之间进行通信..

换句话说,当我在复合 "A" 中单击一个按钮时,我需要在复合 "B" 中更新 table 或获取 table 的元素!

我有两个建议,但我不知道它们是否更好...

  1. 将基 class 传递给复合体,并在父级之间进行通信;
  2. composites 扩展基础 class 并调用 "parent.updateTableOfCompositeB()"

我构建这个简单的例子是为了更好地理解问题。

我的基地class:

public class Test {
    protected Shell shell;
    public static void main(String[] args) {
        try {
            Test window = new Test();
            window.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void open() {
        Display display = Display.getDefault();
        createContents();
        shell.open();
        shell.layout();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }
    protected void createContents() {
        shell = new Shell();
        shell.setSize(450, 300);
        shell.setText("SWT Application");
        shell.setLayout(new FillLayout(SWT.HORIZONTAL));

        Composite butComposite = new buttonsComp(shell, SWT.NONE);
        Composite tableComposite = new TableComp(shell, SWT.NONE);
    }
}

我的按钮组合:

public class buttonsComp extends Composite {
    public buttonsComp(Composite parent, int style) {
        super(parent, style);
        setLayout(new FillLayout(SWT.HORIZONTAL));
        Button btnNewButton = new Button(this, SWT.NONE);
        btnNewButton.setText("New Button");
        Button btnAsd = new Button(this, SWT.NONE);
        btnAsd.setText("asd");
    }
    @Override
    protected void checkSubclass() {
    }
}

我的table复合

public class TableComp extends Composite {
    private Table table;

    public TableComp(Composite parent, int style) {
        super(parent, style);
        setLayout(new FillLayout(SWT.HORIZONTAL));

        table = new Table(this, SWT.BORDER | SWT.FULL_SELECTION);
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        TableColumn tblclmnColumn = new TableColumn(table, SWT.NONE);
        tblclmnColumn.setWidth(100);
        tblclmnColumn.setText("column1");
    }
    @Override
    protected void checkSubclass() {
    }
    public void updateTable(){
        for (int i = 0; i < 100; i++) {
            TableItem item = new TableItem(table, i);
            item.setText("bla" + i);
        }
    }
}

什么是更好的方法?

对不起我的英语.. 问候 亚历山大

向 swt 小部件添加侦听器也许是正确的方法。您可以在下面的代码片段中显示的行上做一些事情。

Button button =  new Button(shell, SWT.PUSH);
Table table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
..
..
//register listener for the selection event on the button
button.addSelectionListener(new SelectionAdapter() {
    @Override
    public void widgetSelected(SelectionEvent e) {
        System.out.println("Listener Called!");
        table.getItems();  //or do what you want with the table.
    }
});

我会选择一个事件设计,其中您的组合是听众、处理者或两者兼而有之,具体取决于谁必须获得信息。

http://www.marco.panizza.name/dispenseTM/slides/exerc/eventNotifier/eventNotifier.html

尽管调解员可能对您的案件有所帮助,但让我们采用简单的方法。

首先你需要一个事件。此外,在这种情况下,假设您想在事件中发送消息。当然,您可以在实施过程中添加您发现可能需要的任何字段。

import java.util.EventObject;

public class SomethingHappenedEvent extends EventObject{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private String message;

    public SomethingHappenedEvent(Object source, String message) {
        super(source);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}

那么您将需要一个事件侦听器。这将是您稍后将在每个需要通知的 class 上实现的接口。

import java.util.EventListener;

public interface SomethingHappenedListener extends EventListener {

    public void somethingHappened(SomethingHappenedEvent e);
}

接下来您需要处理这些事件,并且能够将它们发送给正确的侦听器。让我们再次考虑最简单的情况,即您将事件发送给处理程序中注册的每个侦听器。

对于这个例子,我将使用您的 TableComp class。

import javax.swing.event.EventListenerList;

public class TableComp extends Composite {
    private Table table;

    //Event listener list ===================================
    private EventListenerList listenerList = new EventListenerList();

    public TableComp(Composite parent, int style) {
        super(parent, style);
        setLayout(new FillLayout(SWT.HORIZONTAL));

        table = new Table(this, SWT.BORDER | SWT.FULL_SELECTION);
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        TableColumn tblclmnColumn = new TableColumn(table, SWT.NONE);
        tblclmnColumn.setWidth(100);
        tblclmnColumn.setText("column1");
    }
    @Override
    protected void checkSubclass() {
    }
    public void updateTable(){
        for (int i = 0; i < 100; i++) {
            TableItem item = new TableItem(table, i);
            item.setText("bla" + i);
        }
        //===================TABLE WAS UPDATED. FIRE EVENT ==================
        fireEvent(new SomethingHappenedEvent("foo"));
    }

    /*
     * ========== Event Handling ==========
     */
    public void addMessageListener(SomethingHappenedListener listener) {
        listenerList.add(SomethingHappenedListener.class, listener);
    }
    public void removeMessageListener(SomethingHappenedListener listener) {
        listenerList.remove(SomethingHappenedListener.class, listener);
    }
    public void fireEvent(SomethingHappenedEvent evt) {
        Object[] listeners = listenerList.getListenerList();
        for (int i = 0; i < listeners.length; i = i+2) {
            if (listeners[i] == SomethingHappenedListener.class) {
                ((SomethingHappenedListener) listeners[i+1]).somethingHappened(evt);
            }
        }
    }
}

请注意,我只将事件触发到我想要的侦听器类型,在此 SomethingHappenedListener 类型中。可以根据您自己的目的更改此行为。

现在假设您要处理按钮中的事件 class。只需实现监听器即可。

public class buttonsComp extends Composite implements SomethingHappenedListener{

    public buttonsComp(Composite parent, int style) {
        super(parent, style);
        setLayout(new FillLayout(SWT.HORIZONTAL));
        Button btnNewButton = new Button(this, SWT.NONE);
        btnNewButton.setText("New Button");
        Button btnAsd = new Button(this, SWT.NONE);
        btnAsd.setText("asd");
    }

    @Override
    protected void checkSubclass() {

    }

    public void somethingHappened(SomethingHappenedEvent e)
    {
        //do stuff....
    }
}