java窗体监听器_如何实现Swing的窗体与监听器相分离

新手上路,请多指教。

个人对桌面小程序比较感兴趣,闲来无事便想试着用swing来写个小程序玩玩。于是乎先找各种文档参考。发现好多代码都是把窗体类和监听器类放在一起,这样胡子眉毛一把抓,让作为新手的我阅读起来很是费劲,而且这种代码即使是新手的我也知道如果维护起来那将是一场灾难。既然写在一起不好,那分开不就行了嘛。

本来觉得这是件很简单的事情,但是操作起来却一波三折。首先,把原来混杂的代码分开,分别写在两个类里,然后在对应的组件上加上监听器。然后,问题就来了:很多个组件,应该怎么加监听器?每个监听器一个类?!这太恐怖了吧,干脆砍了我算了。找找看看有没有解决的办法。哈哈,找到一个有用的方法:setActionCommand()和getActionCommand()。有了这组方法,那我就可以把每个组件标一个“命令标签”。先写上一个试试:“清除”按钮上设置一个:

clean=new JButton("Clean");

clean.setActionCommand("clean");

这样在监听器的方法actionPerformed()中就可以用条件判断语句来分门别类的执行对应的方法啦。

接着来写,实现“清除”的动作:点击“清除”按钮,清空输入框(JTextField)中的内容。问题又来了:这是一个需要有反馈的问题,仅仅把代码分开是没用的啊。如果想要监听器能够对窗体操作,那么就必须得能获得到窗体,也就是说就得在监听器中存一个窗体变量。按照这个思路,在监听器中new一个窗体对象。三下五除二写完这段代码,运行。出错了:

Exception in thread "main" java.lang.StackOverflowError

at java.awt.geom.Rectangle2D.(Rectangle2D.java:511)

at java.awt.Rectangle.(Rectangle.java:211)

at sun.awt.Win32GraphicsConfig.getBounds(Native Method)

at sun.awt.Win32GraphicsConfig.getBounds(Win32GraphicsConfig.java:222)

at java.awt.Window.init(Window.java:497)

at java.awt.Window.(Window.java:536)

at java.awt.Frame.(Frame.java:420)

at javax.swing.JFrame.(JFrame.java:224)

栈溢出?!检查一下。原来是这样:在窗体类中new了一个监听器类,在监听器类中又new了一个窗体类。这么交替的new下去当然会死循环实例化对象了。这该如何是好呢?

进过各种途径的查资料,问大神。终于让我找到了解决方法:在监听器类中是需要一个窗体类,但是不可以用new的方法来实例化,而是采用有参数的构造方法的形式,将窗体类以参数的形式传给监听器类。试验一下,运行,在输入框中输入字符,点击“清除”,成功啦!

总结:清晰的代码作风是一个好的习惯;

在遇到问题是先查资料,看看是否有已经解决的方案;

认真理解编程的思路,“遇到这个问题,我要达到目的,理论上要怎么办?”

遇到自己解决不了的问题一定要及时以各种途径问达人。

两个类不可以在构造方法中相互实例化,会造成循环实例化。

如果两个A,B类需要相互调用对方的方法,那么就在B中写一个参数为A的构造方法,然后在A中new一个带参数的B,将自身作为参数传过去。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值