新手上路,请多指教。

      个人对桌面小程序比较感兴趣,闲来无事便想试着用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.<init>(Rectangle2D.java:511)
at java.awt.Rectangle.<init>(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.<init>(Window.java:536)
at java.awt.Frame.<init>(Frame.java:420)
at javax.swing.JFrame.<init>(JFrame.java:224)

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

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

 

 

总结:

  1. 清晰的代码作风是一个好的习惯;

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

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

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

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

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