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

时间:2015-01-09 21:58:55

标签: java swt

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

换句话说,当我点击复合材料内的一个按钮时,A" A"我需要复合表中的更新表" B"或者获取该表的元素!

我有两次吸烟,但我不知道他们是否更好......

  1. 将基类传递给复合,并在父级之间进行通信;
  2. 复合扩展基类并调用例如" parent.updateTableOfCompositeB()"
  3. 我构建了这个简单的例子,以便更好地解决问题。

    我的基类:

    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() {
        }
    }
    

    我的桌子组合

    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);
            }
        }
    }
    

    更好的方法是什么?

    抱歉,我的英文.. 问候 亚历山大

2 个答案:

答案 0 :(得分:2)

我会参加一个活动设计,你的复合材料是听众,处理程序或两者兼而有之,取决于谁必须获取信息。

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;
    }

}

然后你需要一个事件监听器。这将是您稍后将在需要通知的每个类上实现的接口。

import java.util.EventListener;

public interface SomethingHappenedListener extends EventListener {

    public void somethingHappened(SomethingHappenedEvent e);
}

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

对于这个例子,我将使用你的TableComp类。

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类型中。此行为可以根据您自己的目的进行更改。

现在假设你想要在按钮类中处理事件。只需实现监听器即可完成。

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....
    }
}

答案 1 :(得分:0)

向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.
    }
});