我在SWT中构建一个包含两个复合体的应用程序,我需要在它们之间进行通信。
换句话说,当我点击复合材料内的一个按钮时,A" A"我需要复合表中的更新表" B"或者获取该表的元素!
我有两次吸烟,但我不知道他们是否更好......
我构建了这个简单的例子,以便更好地解决问题。
我的基类:
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);
}
}
}
更好的方法是什么?
抱歉,我的英文.. 问候 亚历山大答案 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.
}
});