我想问你几个关于Gui的问题。
我看到了以下示例:
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) - 按下按钮时发生了什么?这个活动是什么? event是按钮本身的一个实例?
(iv) - Button b = (Button) e.getSource();
为什么我需要这个源代码?正如所写的那样,事件只能来自ok,这是按钮的实例。
(v) - 为什么原始按钮会改变其标题?我们改变B。
非常感谢!
答案 0 :(得分:2)
(i) GUI通常使用observer pattern,其中一个或多个对象订阅一个事件,每当发生此事件时,它都会发送到所有订阅的对象,就像你的按钮一样。
(ii) 您将实例发送给侦听器以便关联它们,以便他们可以在适当的时候收到该事件。
(iii) 会发生什么事情导致观察者收到按钮被按下的通知,这最终会导致某些代码被执行。事件本身不是按钮的实例,而是处理事件的单独实例。
(iv) 您需要强制转换它,因为方法签名只是通用的,因为它用于几种类型的事件。
(v) 它更改了标题,因为使用观察者模式,在这种情况下,观察者会在按下按钮的事件发生时通知您的按钮。
答案 1 :(得分:2)
(i)“听众”背后的想法是,您希望提供将被通知事件的组件,对象,软件模块等的列表。按钮单击不仅仅触发某些事情的原因是因为某些东西必须正在监听该事件才能对其做出反应。可以添加任何实现适当的Listener接口的对象(取决于事件的类型),从而处理事件。
(ii)这是一个回调。你必须告诉监听器,“这是一个可以处理你的事件的对象实例。请将它添加到要通知的对象列表中。”从某种意义上说,它有点像订阅RSS提要 - 列表中的每个人都会在发生更新时获得更新。
(iii)该事件是一个单独的对象。窗口系统(在某个深层次,连接到底层OS的窗口库)创建事件对象,然后在已注册的监听器列表中向下通知每个窗口。这有一些例外(例如,监听器可能会吸收一个事件,阻止列表中的其他人听到它,但这是一个独立的问题)
(iv)因为getSource()返回组件的实例。如果您希望能够访问特定于Button的方法(在以下行中使用setText
完成),则必须处理该方法调用的Button实例以了解要执行的操作(即在哪个班级上运作。)
(v)按钮没有改变它的标题 - ButtonHandler正在这样做。因此,当窗口小部件被选中时,在ButtonHandler中调用“widgetSelected”方法。然后它检查事件的来源(提供对原始按钮的引用),然后更新按钮的文本以反映它已被点击。
答案 2 :(得分:2)
当有人按下按钮时,按钮会调用widgetSelected()
因为这就是图书馆的设计方式;它需要打电话给一些
方法,所以你可以做一些事情,他们决定采用这种方法。该
它之所以称之为widgetSelected()
,是因为你给了它
它要调用的类。按钮知道你的班级有
widgetSelected()
方法,因为您已实施
SelectionListener
,这需要您实施
widgetSelected()
方法。这就是接口的原因,
我建议你阅读它们。只需点击按钮即可
得到按钮来调用你的方法因为按钮只知道
当它被点击时。当屏幕上有一个点击时,只有
需要了解它的小部件被告知。
正如我上面提到的,您将处理程序发送到按钮以便它 知道在推动它时该怎么做。
按下按钮时,必须告诉处理程序
发生了,因此所有相关信息都是作为一个给你的
SelectionEvent
。事件本身不是按钮,而是事件
告诉你按下了哪个按钮,以防你需要相同的处理程序
处理多个按钮。
您需要演员,因为您的widgetSelected()
方法可以
当各种GUI对象发生某些事情时调用,而不仅仅是
纽扣。因此,源是作为一些超类常见的
所有可以调用你的方法的小部件,你需要强制转换
当你确定它是你的按钮时它会回到一个按钮。是的,在这
程序只能通过按钮调用,但并非总是这样
案件。
按钮的文本会更改,因为B和您创建和显示的按钮是同一个对象。 Java中的对象(和数组)是“指针”,它们告诉您对象的位置。当您将一个对象分配给另一个变量时,您没有复制该对象,您只是使用另一个变量指向同一个对象。