我想问你几个有关桂的问题。
我看到了以下示例:
public class ShellWithButton {
public static void main(String[] args) {
Display display = Display.getDefault();
Shell shell = newShell (display);
Button ok = newButton (shell, SWT.PUSH);
ok.setText ("Push Me!");
ok.addSelectionListener(new ButtonHandler());
ok.setLocation(0,0);
ok.setSize(100,30);
shell.pack ();
shell.open ();
while(!shell.isDisposed ()) {
if(!display.readAndDispatch())
display.sleep ();
}
display.dispose ();
}
}
public class ButtonHandler
implements SelectionListener {
public void widgetSelected(SelectionEvent e) {
if(e.getSource() instanceofButton) {
Button b = (Button) e.getSource();
b.setText("Thanks!");
}
}
public voidwidgetDefaultSelected(SelectionEvent e){
// TODO Auto-generated method stub
}
}
(i)-有人按下按钮-程序如何知道激活widgetSelected?
我可以看到该按钮向其自身添加了ButtonHandler侦听器,但是为什么按下按钮而不只是单击该框会将事件发送给ButtonHandler?
我看不到仅将推送发送到此侦听器的位置。
(ii)-为什么将ButtonHandler的实例发送给侦听器?这意味着什么?
(iii)-当我按下按钮时会发生什么?这是什么事事件是按钮本身的实例吗?
(iv)-
Button b = (Button) e.getSource();
为什么需要这种源代码转换?如所写,该事件只能来自于OK(它是按钮的实例)。(v)-为什么原始按钮会更改其标题?我们改变B。
非常感谢你!
最佳答案
当有人按下按钮时,该按钮会调用widgetSelected()
因为那是库的设计方式;它需要打电话给一些
方法,因此您可以做点什么,他们便决定使用该方法。的
之所以称呼您的widgetSelected()
是因为您给了它
调用它的类。该按钮知道您的班级有一个widgetSelected()
方法,因为您已实现SelectionListener
,这需要您实施widgetSelected()
方法。那就是建立接口的原因
我建议您阅读它们。仅单击按钮将
获取按钮以调用您的方法,因为该按钮仅知道
单击时。在屏幕上单击时,只有
告知需要了解的小部件。
如上所述,您将处理程序发送给按钮,这样
知道推送时该怎么办。
按下按钮时,它必须告诉您的处理程序
发生了,因此所有相关信息都作为SelectionEvent
。事件本身不是按钮,而是事件
告诉您按下哪个按钮,以防您需要相同的处理程序
处理多个按钮。
您需要强制转换,因为您的widgetSelected()
方法可以是
当各种GUI对象发生某种情况时调用,而不仅仅是
纽扣。因此,源是作为某些超类通用给出的
到可以调用您的方法的所有小部件,并且您需要进行强制转换
当您确定它是按钮时,将其返回到按钮。是的,在这
程序只能通过按钮调用,但这并不总是如此
案子。
按钮的文本更改,因为B与您创建和显示的按钮是同一对象。 Java中的对象(和数组)是“指针”,它们告诉您对象在哪里。当您将一个对象分配给另一个变量时,您并没有在复制该对象,而只是在使用另一个变量来指向同一对象。