步骤 1 : 监听器访问组件 步骤 2 : 在面板类中,把组件声明为public的属性 步骤 3 : 把面板类设计为单例模式 步骤 4 : 监听器通过单例模式的面板访问组件
完整的J2SE桌面项目,从无到有完整的开发流程,涵盖全部52个知识点,154个开发步骤, 一共36个讲解视频,累计时长3小时10分59秒,大小1.94G,充实J2SE项目经验,为简历加上一个有吸引力的砝码
增值内容,点击购买
在本项目中,各种按钮监听器的主要作用是获取组件的值,和修改组件的值。
这就涉及到了在Listener中如何访问组件的问题。 那么如何使得监听器可以方便得获取组件呢? 这就需要用到两个设计手段 1. 在面板类中,把组件声明为public的属性 2. 把面板类设计为单例模式
完整的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天");
}
完整的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(){
}
}
完整的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才可以
3 个答案
newbeeee 跳转到问题位置 答案时间:2020-08-07 确实应该私有化构造函数呀
shanyu 跳转到问题位置 答案时间:2020-07-06 代码都没贴出来,怎么知道错在哪里呢
how2j 跳转到问题位置 答案时间:2020-06-30 private 之后报什么错吗?
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2020-02-19
请问我这一步创建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 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|