how2j.cn

下载区
文件名 文件大小
hutubill.rar 6k
使用站长秘制下载工具

9分56秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器

步骤 1 : 监听器访问组件   
步骤 2 : 在面板类中,把组件声明为public的属性   
步骤 3 : 把面板类设计为单例模式   
步骤 4 : 监听器通过单例模式的面板访问组件   

步骤 1 :

监听器访问组件

edit
完整的J2SE桌面项目,从无到有完整的开发流程,涵盖全部52个知识点,154个开发步骤, 一共36个讲解视频,累计时长3小时10分59秒,大小1.94G,充实J2SE项目经验,为简历加上一个有吸引力的砝码
增值内容,点击购买
在本项目中,各种按钮监听器的主要作用是获取组件的值,和修改组件的值。
这就涉及到了在Listener中如何访问组件的问题。

那么如何使得监听器可以方便得获取组件呢? 这就需要用到两个设计手段
1. 在面板类中,把组件声明为public的属性
2. 把面板类设计为单例模式
步骤 2 :

在面板类中,把组件声明为public的属性

edit
完整的J2SE桌面项目,从无到有完整的开发流程,涵盖全部52个知识点,154个开发步骤, 一共36个讲解视频,累计时长3小时10分59秒,大小1.94G,充实J2SE项目经验,为简历加上一个有吸引力的砝码
增值内容,点击购买
以SpendPanel为例子,其中有各种标签对象,把这些标签对象设计成public 的属性,那么只要能够获取SpendPanel实例,就能很方便的获取这些组件。
像这样:

SpendPanel p=new SpendPanel();
p.vMonthSpend.setText("¥3333");
package gui.panel; import javax.swing.JLabel; public class SpendPanel { JLabel lMonthSpend = new JLabel("本月消费"); JLabel lTodaySpend = new JLabel("今日消费"); JLabel lAvgSpendPerDay = new JLabel("日均消费"); JLabel lMonthLeft = new JLabel("本月剩余"); JLabel lDayAvgAvailable = new JLabel("日均可用"); JLabel lMonthLeftDay = new JLabel("距离月末"); JLabel vMonthSpend = new JLabel("¥2300"); JLabel vTodaySpend = new JLabel("¥25"); JLabel vAvgSpendPerDay = new JLabel("¥120"); JLabel vMonthAvailable = new JLabel("¥2084"); JLabel vDayAvgAvailable = new JLabel("¥389"); JLabel vMonthLeftDay = new JLabel("15天"); }
步骤 3 :

把面板类设计为单例模式

edit
完整的J2SE桌面项目,从无到有完整的开发流程,涵盖全部52个知识点,154个开发步骤, 一共36个讲解视频,累计时长3小时10分59秒,大小1.94G,充实J2SE项目经验,为简历加上一个有吸引力的砝码
增值内容,点击购买
接着就是如何获取这些面板类呢? 通过分析,我们意识到,其实,面板类的实例只需要有一个就行了。

比如SpendPanel,只需要一个实例就可以了,不需要每次显示这个面板的时候都创建新的实例。 不仅是不需要,也不应该每一次都创建新的实例。

所以把SpendPanel设计成单例模式就能很好的解决这个问题。

而单例模式有很多种写法,像饿汉式单例模式 懒汉式单例模式 等等,其不同的方式总计有八种,甚至更多,这里我们进一步简化,活学活用,使用最简单的单例模式
直接声明一个SpendPanel类型的静态属性,并指向当前实例。

public static SpendPanel instance = new SpendPanel();

这样的写法虽然不常见,但是刚好满足我们的需要。
package gui.panel; import javax.swing.JLabel; public class SpendPanel { public static SpendPanel instance = new SpendPanel(); JLabel lMonthSpend = new JLabel("本月消费"); JLabel lTodaySpend = new JLabel("今日消费"); JLabel lAvgSpendPerDay = new JLabel("日均消费"); JLabel lMonthLeft = new JLabel("本月剩余"); JLabel lDayAvgAvailable = new JLabel("日均可用"); JLabel lMonthLeftDay = new JLabel("距离月末"); JLabel vMonthSpend = new JLabel("¥2300"); JLabel vTodaySpend = new JLabel("¥25"); JLabel vAvgSpendPerDay = new JLabel("¥120"); JLabel vMonthAvailable = new JLabel("¥2084"); JLabel vDayAvgAvailable = new JLabel("¥389"); JLabel vMonthLeftDay = new JLabel("15天"); private SpendPanel(){ } }
步骤 4 :

监听器通过单例模式的面板访问组件

edit
完整的J2SE桌面项目,从无到有完整的开发流程,涵盖全部52个知识点,154个开发步骤, 一共36个讲解视频,累计时长3小时10分59秒,大小1.94G,充实J2SE项目经验,为简历加上一个有吸引力的砝码
增值内容,点击购买
监听器就可以通过单例模式的面板访问组件了

SpendPanel p=SpendPanel.instance;
p.vMonthSpend.setText("¥3333");

这样做就非常的方便。
任何监听器,要访问任何面板上的任何组件,都会变得非常的便捷
直接在main方法中new JFrame中使用传统的内部类方式添加监听器,代码更容易维护。
这一块的理解在大家接触到后面的功能模块的时候,会感觉更明显


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2020-06-29 为什么我的要改成public才可以
爱人

就是那个构造方法我必须要改成public才可以,为什么private不可以




3 个答案

newbeeee
答案时间:2020-08-07
确实应该私有化构造函数呀

shanyu
答案时间:2020-07-06
代码都没贴出来,怎么知道错在哪里呢

how2j
答案时间:2020-06-30
private 之后报什么错吗?



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2020-02-19 请问我这一步创建SpendPanel sp = new SpendPanel();时为什么显示无法解析SpendPanel。用的idea
19970329

请问我这一步创建SpendPanel sp = new SpendPanel();时为什么显示无法解析SpendPanel。用的idea




2 个答案

Imsorry
答案时间:2021-04-21
设计成单例模式,构造方法私有化,SpendPanel sp = new SpendPanel();创建对象用的是公共构造函数,此时通过类名.变量名获取即可,HutuMainFrame这个类中的SpendPanel sp = new SpendPanel();直接注释就行了,再把传入监听器的sp删了就好,视频中老师没说

how2j
答案时间:2020-02-20
因为 SpendPanel 的构造方式是 private 的哦



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2020-02-16 我替换JLabel为public JLabel的时候,会把后面构造方法那里也替换掉,怎么才能避免这种现象?
2018-10-31 关于SpendPanel.instance;的问题
2018-03-26 将面板类设计为单例模式有什么好处?


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 5 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 实践项目-一本糊涂账-单例的面板类 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图