1、public void addWindowListener(WindowListener l)添加指定的窗口侦听器,以从此窗口接收窗口事件。如果 l 为 null,则不抛出任何异常,且不执行任何操作。
我们提供的服务有:做网站、网站设计、微信公众号开发、网站优化、网站认证、崇明ssl等。为上1000+企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的崇明网站制作公司
这个是API中的方法定义,此方法参数为接口WindowListener,任何实现该接口的类都可以作为参数。
2、public abstract class WindowAdapter implements WindowListener, WindowStateListener, WindowFocusListener
接收窗口事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。
扩展此类可创建 WindowEvent 侦听器并为所需事件重写该方法。(如果要实现
WindowListener 接口,则必须定义该接口内的所有方法。此抽象类将所有方法都定义为
null,所以只需针对关心的事件定义方法。)
使用扩展的类可以创建侦听器对象,然后使用窗口的 addWindowListener
方法向该窗口注册侦听器。当通过打开、关闭、激活或停用、图标化或取消图标化而改变了窗口状态时,将调用该侦听器对象中的相关方法,并将
WindowEvent 传递给该方法。
3、如果我想在代码中一次性使用某个类(抽象类或具体类)或接口,可以使用匿名类的方式,这样不需自己定义一个My***类,然后再使用,比较方便。用法就是直接在new WindowAdapter()后面加入类定义,在其中实现或覆盖方法就可以了。
匿名类不是返回值,而是相当于new String(“hello”)这种的扩展形式。我觉得匿名类的最多用处就是加监听器时。
附上WindowAdapter源代码:
public abstract class WindowAdapter
implements WindowListener, WindowStateListener, WindowFocusListener
{
public void windowOpened(WindowEvent e) {}
public void windowClosing(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowStateChanged(WindowEvent e) {}
public void windowGainedFocus(WindowEvent e) {}
public void windowLostFocus(WindowEvent e) {}
}
一个一个来吧。
第一个问题:
并不是Label.Left无效,而是你API理解错了。由于你之前的代码里面是把Label放在一个Panel里面,Panel又放在了JFrame里面。而JFrame默认的布局管理器是BorderLayout,而你放入Panel时没有指定放入位置,被默认放在了JFrame的Center位。所以Panel里面的控件都跟着跑到窗口的中间了,这时候你调用Label.Left只是把Label放在了Panel的最左边(不写这个也是如此),而Panel在JFrame的中间,所以,显示效果是居中效果。
如果你希望Label到窗口的最左边,只需要修改一句就可以了:
f.add(p, BorderLayout.WEST); // 将面板p加入到窗口f中
第二个问题:
从功能上说,两者实现的内容一样,不过记住,匿名类里面调用外部变量需要将变量设置为final。内部类本身也是一个类,需要一连串的定义,所以在监控事件特别多的时候,就会导致代码严重冗余,增加维护成本。而匿名类定义监听事件可以和控件写在一起,同时不需要类定义,可以使代码维护起来更容易一些。因此,一般情况下,我们都会使用匿名类来监听事件。
第三个问题:
Label属于AWT的范畴,JLabel和其他以J开头的控件都属于Swing。后者属于前者的扩展,同时也自成一家。AWT对系统依赖较高,不太适合跨平台;Swing所有控件均是运行库自带,与平台无关,运行在哪个系统上都是一个效果(PS:一样的丑),所以适合跨平台。
我建议你才用两种方式中的一种。
第一种:
decreNo.addActionListener(new ActionListener(){
这里是你的响应代码
});
这是匿名内部类的方式
第二种:
最外面的类实现actionListener:
class AndroidApp extends Context implements ActionListener
{
JButton increNo = new JButton("Count up");
JButton decreNo = new JButton("Count down");
increNo.addActionListener(new increNoListener());
decreNo.addActionListener(new decreNoListener());
@override
public void actionPerformed(ActionEvent e)
{
//具体代码
//这里两个按钮的响应函数可以都写在这里,用传入的e来判断
}
}
你直接写一个方法A,在你要监听的那根类的方法B中调用方法A,这样B每次执行当然就会调用A了。