2015-01-09 2 views
0

Я строй приложения в SWT, который содержит два композиционных материалы, и мне нужно, чтобы общаться между ними ..как общаться между двумя композитами в SWT

Другими словами, когда я нажимаю в одной кнопке внутри композита " «Мне нужна таблица обновлений в составном« B »или получить элементы этой таблицы!

У меня есть два sugestions, но я не знаю, если они являются лучшим способом ...

  1. Pass базовый класс для композитов, и commucicate между родителем;
  2. композиты расширяет базовый класс и назвать, например, "parent.updateTableOfCompositeB()"

Я строю этот простой пример для лучшего compreention вопроса ..

мой базовый класс:

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

Я бы с дизайном событий, где ваши композиты являются либо Слушателей, Манипуляторы или оба, в зависимости от того, кто должен получить информацию.

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.... 
    } 
} 
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. 
    } 
}); 
Смежные вопросы