如何在swt中的两个复合材料之间进行通信
how to communicate between two composites in swt
我正在 SWT 中构建一个包含两个组合的应用程序,我需要在它们之间进行通信..
换句话说,当我在复合 "A" 中单击一个按钮时,我需要在复合 "B" 中更新 table 或获取 table 的元素!
我有两个建议,但我不知道它们是否更好...
- 将基 class 传递给复合体,并在父级之间进行通信;
- 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....
}
}
我正在 SWT 中构建一个包含两个组合的应用程序,我需要在它们之间进行通信..
换句话说,当我在复合 "A" 中单击一个按钮时,我需要在复合 "B" 中更新 table 或获取 table 的元素!
我有两个建议,但我不知道它们是否更好...
- 将基 class 传递给复合体,并在父级之间进行通信;
- 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....
}
}