SWT的时间模型和JAVA标准的AWT基本相同 事件产生处的SWT组件成为事件源,对事件作出具体动作成为监听器(Listener)监听其负责监听组件上的事件,并对发生的事件进行处理。基本的模式是将一个监听器添加到已经创建的组件中,当相应的事件发生时,监听器的代码就会被执行。
SWT的常用事件
每一类型的监听器,都有一个接口来定义这种监听器,由类提供时间信息,由应用程序接口方法负责添加监听器,如果一个监听器接口中定义了多个方法,则会提供一个适配器来实现监听器接口并同时提供空方法。所有的事件,监听器和适配器都放在包org.eclipse.swt.events中
常用事件:
1.addMousseListener 鼠标监听器
mouseDown() 鼠标按下时触发
mouseUp() 鼠标松开始触发
2.addKeyListener 按键监听器
keyPressed() 当焦点在组件上时,按下键盘任意键时触发 对某些组件(如Button)按回车时不能触发
keyReleased() 按键弹起时触发
3.addSelectionListener 组件选择监听器
widgetSelection() 组件被选择时(单击鼠标 焦点在组件上时按回车键)触发
4.addFocusListener 焦点监听器
focusGained() 得到焦点时触发
focusLost() 失去焦点时触发
import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.layout.*; public class HelloSWT { public static void main(String[] args) { Display display = new Display(); final Shell shell = new Shell(display); RowLayout rowlayout = new RowLayout(); rowlayout.marginWidth = 20; rowlayout.marginHeight = 30; shell.setLayout(rowlayout); shell.setText("SWT事件处理示例"); RowData rowData = new RowData(); rowData.width = 100; rowData.height = 50; Text text = new Text(shell,SWT.BORDER|SWT.WRAP); text.setLayoutData(rowData); text.addMouseListener(new MouseAdapter(){ public void mouseDoubleClick(MouseEvent e){ text.setText("文本框中鼠标双击事件发生!"); MessageBox dialog = new MessageBox(shell,SWT.OK|SWT.ICON_INFORMATION); dialog.setText("Double click"); dialog.setMessage("文本框中鼠标双击事件发生!"); dialog.open(); } }); shell.pack(); shell.open(); while(!shell.isDisposed()){ if(!display.readAndDispatch()){ display.sleep(); } } display.dispose(); } }
下面是键盘监听器:
在第一个Text中输入文本,敲击回车后,第二个Text中显示与第一个Text中相同内容。
但第一个Text中文本消失,且改变文本再敲回车,第二个Text不会改变 尚不知道怎么解决。
import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.graphics.*; public class HelloSWT { static Text text1,text2; public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); GridLayout layout = new GridLayout(); layout.numColumns = 2; shell.setLayout(layout); shell.setText("Event demo"); Label label1 = new Label(shell,SWT.RIGHT); label1.setText("label1:"); text1 = new Text(shell,SWT.BORDER|SWT.WRAP); GridData gridData1 = new GridData(100,30); text1.setLayoutData(gridData1); text1.addKeyListener(new KeyAdapter(){ public void keyPressed(KeyEvent e){ if(e.keyCode==SWT.CR){ text2.setText(text1.getText()); } } }); Label label2 = new Label(shell,SWT.RIGHT); label2.setText("text2:"); text2 = new Text(shell,SWT.BORDER|SWT.WRAP); GridData gridData2 = new GridData(100,30); text2.setLayoutData(gridData2); text2.setEditable(false); text2.setBackground(new Color(display,205,255,255)); shell.pack(); shell.open(); while(!shell.isDisposed()){ if(!display.readAndDispatch()){ display.sleep(); } } display.dispose(); } }
下面是监听选择组件
import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.layout.*; public class HelloSWT { static Display display = new Display(); static final Shell shell = new Shell(display,SWT.SHELL_TRIM); public static void main(String[] args) { shell.setText("组件选择事件示例"); Button button = new Button(shell,SWT.PUSH); button.setText("请点击我"); RowLayout layout = new RowLayout(); layout.marginWidth = 10; layout.marginHeight = 10; shell.setLayout(layout); RowData data = new RowData(80,40); button.setLayoutData(data); button.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e){ MessageBox dialog = new MessageBox(shell,SWT.ICON_INFORMATION); dialog.setText("组件选择事件"); dialog.setMessage("你好,SWT世界"); dialog.open(); } }); shell.pack(); shell.open(); while(!shell.isDisposed()){ if(!display.readAndDispatch()){ display.sleep(); } } display.dispose(); } }
以上示例中,在button.addSelectionListener()方法内部建立了一个匿名内部类,该类继承于SelectionAdapter 在widgetSelected()方法中写下了事件处理的代码。
另一种写法是采用命名内部类。
相应代码改为:
button.addSelectionListener(new MySelectionListener());
并在类HelloSWT中定义内部类
private static final class MySelectionListener extends SelectionAdapter{ public void widgetSelected(SelectionEvent e){ MessageBox dialog = new MessageBox(shell,SWT.OK|SWT.ICON_INFORMATION); dialog.setText("组件选择事件"); dialog.setMessage("你好,SWT世界"); dialog.open(); } }