java应用中的子窗口切换,引出抽象类与接口的本质区别

C++开发基础之掌握常用的三种异步编程模型 以上是三种常见的C++异步编程模型,每种模型都有其适用的场景和特点。根据具体需求,你可以选择合适的模型来进行异步编程。 阅读详情

     今天一同学问我,如何在一个java应用窗口(JFrame)中切换其内的子窗口(JInternalFrame)。

     我想了一下,因为所有的子窗口都可以说是有共同特性的对象,觉得用抽象类来代表一个最原始的子窗口类,并在这个抽象类中建立一个方法专门来负责窗口切换,所有继承它的子窗口都可以用到这个方法来实现切换功能。

     我一说抽象类,他说到现在还未搞懂抽象类还有接口到底是用来干什么的。而且上述问题为什么不用接口来实现,定义一个切换方法,所有实现它的子窗口都实现这个切换方法。暂且不说抽象类与接口的区别。现在将上述问题的简要代码给出:

抽象子窗口父类:

import java.awt.FlowLayout;
import javax.swing.JInternalFrame;

//所有子窗口的父类
public abstract class Parent extends JInternalFrame {
	
	MainFrame main;
	public Parent() {
	}

	public Parent(MainFrame main) {
		this.main = main;
		
		//这里可以设置一些子窗口统一的属性,如背景,字体大小等等
		this.setLayout(new FlowLayout(FlowLayout.CENTER));
	}

	//切换到其它子窗口的方法
	public void toOtherFrame(Parent p) {
		this.setVisible(false);
		p.setVisible(true);
	}
}

     大多数情况下,为了方便管理,程序需要找一个管理所有引用的对象,由于所有的子窗口都在应用窗口下,故让应用窗口对象来持众多子窗口对象。可以看出,用抽象类来实现,当我们要切换窗口时,只要子窗口继承了这个Parent类,其都可以当做一个切换对象传进来。

基于这个Parent类,创建欢迎子窗口(WelcomeFrame)与结束子窗口(GoodbyeFrame):

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;

public class WelcomeFrame extends Parent{
	
	public WelcomeFrame(MainFrame main){
		//所有对象都同父类一样,持有管理者的引用。
		super(main);
		launchFrame();
	}

	private void launchFrame() {
		this.setTitle("WELCOME");
		this.setVisible(true);
		JButton jb = new JButton("去GOODBYEFRAME");
		jb.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				//调用父类的切换方法,将要切换的子窗口对象传入
				WelcomeFrame.this.toOtherFrame(main.getOf());
			}
		});
		this.add(jb);		
	}
}

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;

public class GoodbyeFrame extends Parent{

	public GoodbyeFrame(MainFrame main){
		//所有对象都同父类一样,持有管理者的引用。
		super(main);
		launchFrame();
	}

	private void launchFrame() {
		this.setTitle("GOODBYE");
		this.setVisible(true);
		JButton jb = new JButton("去WELCOMEFRAME");
		jb.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				//调用父类的切换方法,将要切换的子窗口对象传入
				GoodbyeFrame.this.toOtherFrame(main.getWf());
			}
		});
		this.add(jb);		
	}
}

应用窗口(MainFrame):

import javax.swing.JFrame;

public class MainFrame extends JFrame {

	private WelcomeFrame wf = null;
	private GoodbyeFrame of = null;

	public WelcomeFrame getWf() {
		return wf;
	}

	public void setWf(WelcomeFrame wf) {
		this.wf = wf;
	}

	public GoodbyeFrame getOf() {
		return of;
	}

	public void setOf(GoodbyeFrame of) {
		this.of = of;
	}

	public static void main(String[] args) {
		new MainFrame().launchFrame();
	}

	private void launchFrame() {
		this.setBounds(200, 100, 400, 400);
		this.setLayout(null);
		wf = new WelcomeFrame(this);
		of = new GoodbyeFrame(this);
		wf.setBounds(0, 0, 385, 365);
		of.setBounds(0, 0, 385, 365);
		this.add(wf);
		this.add(of);
		this.setVisible(true);
	}
}

    通过上述的例子,可以看出抽象类的使用确实为程序功能的实现提供很大的帮助,至少不至于为每个子窗口都写一个切换的方法,而且切换窗口的方法,所传递的对象也是java多态的一种体现。

    回到同学的问题上,为什么不用接口?。

    通常来说,站在语言本身的设计理念上来说,接口表示的是一种行为模型,一个类实现了某个接口,也就代表着其拥有某种行为能力,从java所提供的一些常用接口就可以看出这些特性,如Cloneable,Serializable,Comparable等等,上述问题为接口也不能说是错的,条条道路通罗马,但是使用接口需要为每个子窗口实现切换窗口的方法,不过接口可以提供很灵活的切换功能(如果需要的话)。

    而对于抽象类,通常是"继承什么抽象类,就是什么",说的是‘is’的概念,Parent是子窗口,其继承它的子类必然也是一个子窗口对象。

   观点纯属个人理解,希望对大家的有所帮助,有不足之处,还望指出,共同学习,共同进步。


永久关闭Windows更新的5种方法 很多家用电脑,如果系统自动更新的话,会变得越来越卡顿,且硬件型号兼容也并不完美。那么我们该如何彻底关闭Win11的自动更新呢?以下准备了5种方法,您可以根据自身实际情况选择合适的方法! 阅读详情

相关推荐

知识的定义与分类体系详解 - 从零基础到专业理解

知识的定义与分类体系详解 - 从零基础到专业理解

engchina的专栏 4365

Java生成父窗体、子窗体的方法。

jMenuItem1.setFont(newjava.awt.Font("Dialog",0,12));//添加菜单项的事件监听器jMenuItem1.addActionListener(newjava.awt.event.ActionListener(){publicvoidactionPerformed(ActionEvente){jMenuItem1_actionPerformed(e);//在父窗口中添加这个子窗口try{frame.setSelected(true);...

xiaoweids的博客 440

PyCharm安装PyQt5及工具(Qt Designer、PyUIC、PyRcc)详细教程来了

Qt是常用的用户界面设计工具,而在Python中则使用PyQt这一工具包,它是Python编程语言和Qt库的成功融合。这篇博文通过图文详细介绍在PyCharm中如何完整优雅地安装配置PyQt5的所有工具包,主要内容包括PyQt5、PyQt5-tools的依赖包安装和Qt Designer、PyUIC、PyRcc三个工具的设置。最后简单演示了PyQt5的调用方式及三个工具的使用方法。

Python966的博客 3万+

Flink窗口分配器WindowAssigner

窗口对象被 Flink 统一封装为抽象类TimeWindow 基于时间范围的窗口,包含开始时间戳和结束时间戳GlobalWindow 全局窗口,与时间无关的窗口如果内置的这两种窗口无法满足你的需求,你也可以自定义窗口。需要注意的是,窗口本身是要在算子间传输的,所以你在自定义窗口的同时,还必须提供一个窗口序列化器,以便于 Flink 可以将你的窗口对象序列化传输。如下示例,我们定义了一个基于数字范围的 NumberWindow,可以将一个数字划分到对应的数字范围窗口内。return min;

程序员小潘 1559

使用Python开发TreeATE的测试脚本常见问题

ImportError: No module named py_compile 找不到 DevLangPython3.dll 以上2个问题都是没有安装正确的Python,当前TreeATE依赖32位Python 2.7版本,暂时不支持Python 3以上版本

蓝白云的专栏 1033

VSCode里玩转AvaloniaUI:手把手教你搭建跨平台桌面应用开发环境(附.NET 7配置避坑)

本文详细介绍了如何在VSCode中搭建AvaloniaUI跨平台桌面应用开发环境,包括.NET 7配置避坑指南。从环境准备、项目创建到调试优化,手把手教你利用VSCode和Avalonia实现高效开发,特别解决了.NET 7依赖等常见问题,助力开发者快速上手跨平台应用开发。

weixin_28826545的博客 577

子窗口切换java应用中的子窗口切换,引出抽象类与接口的本质区别

时间紧张,先记一笔,后续优化与完善。          今天一同窗问我,如何在一个java应用窗口(JFrame)中切换其内的子窗口(JInternalFrame)。          我想了一下,因为全部的子窗口都可以说是有独特特性的对象,觉得用抽象类来代表一个最原始的子窗口类,并在这个抽象类中建立一个方法专门来担任窗口切换,全部继承它的子窗口都可以用到这个方法来实现切换功能。      ...

weixin_34419321的博客 152

基于OpenClaw的AI数字员工协同团队架构设计

随着大型语言模型从被动的文本生成器向具备自主规划与执行能力的智能代理演进,企业级人工智能的应用范式正在发生根本性转变。在这一演进过程中,OpenClaw(前身为Clawdbot及Moltbot)作为一种开源的、本地优先的个人AI智能体网关基础设施,凭借其对持续内存、多通道接入以及沙盒化工具执行的原生支持,迅速成为构建“始终在线”数字劳动力的核心框架 1。然而,将单体个人助理扩展为能够处理复杂业务逻辑、支持跨组织协同并严格保障数据隔离的多智能体(Multi-Agent)团队,绝非简单的API拼接。系统架构必须

形上得其象,形下合于数;阴阳自济,玄理自明。 1047

java中组件与容器_java组件和容器

Java的图形用户界面的最基本组成部分是组件(Component),组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。类java.awt.Component是许多组件类的父类,Component类中封装了组件通用的方法和属性,如图形的组件对象、大小、显示位置、前景色和背景色、边界、可见性等,...

weixin_39947016的博客 782

用 deepseek 写小说(通用版提示词模板)

#Initialization:作为[Role],在[Goals]下,回顾你的[Skill],严格遵守[Constraints],5.第五步:人物大纲,给小说里的每个人物撰写背景故事,深挖人物过去的经历,原生家庭,住所:一栋位于市郊的房子,有三个卧室,房龄 10 年,厨房很大,当中有一个鸟式大理石。示例 2.戈德里洛克先去了熊老爹的工作坊,尝试用大纲法写作,却发现这种方法无聊透顶,1.第一步:一句话概括,一句话概述小说内容,主要包含小说癸型,主角,以及故事中需要。大灰狼的暴行彻底激怒了戈德里洛克,

陈奕昆的博客 2967

Android System UI 深度解析:从架构演进到车载 / TV 场景的全维度定制

本文全面解析 Android System UI 的架构设计、功能演进及场景化定制,揭示其作为安卓系统核心交互层的技术特性与生态价值。

学无止境 1579

Java第八章抽象类和接口

Java第七章抽象类和接口 一、抽象类 ​ 在现实中,我们可以明确一只狗,或者一只猫,但是我们不知道一只宠物指的是什么,相对于猫和狗而言,宠物是猫和狗的一个统称,在java中,宠物是猫和狗的一个父类,而类似这种父类,通常无法进行实例化,我们把它定义为抽象类,用关键字abstract来修饰类名。 ​ 抽象类没有具体的实例,不能被实例化。但是可以创建一个引用变量,其类型是一个抽象类,指向非抽象的子类实例。抽象类不能是最终类。因为抽象类是用来被继承的,而最终类是无法被继承的,互相就矛盾了。 ​ 抽象类的作用

weixin_46511924的博客 234

3D点云-CVPR 2020-PF-Net: Point Fractal Network for 3D Point Cloud Completion

是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像素点与原来像素点比较完成模型的训练。而PF-Net就是采用GAN的思想在3D点云上的应用。

404 Not Found 2369

java最简单的知识之创建一个简单的windows窗口,利用Frame类

作者:程序员小冰,优快云博客:http://blog.youkuaiyun.com/qq_21376985 QQ986945193 微博:http://weibo.com/mcxiaobing 首先给大家看一下效果。当然,就像我们刚学习写代码,写hello world! 很简单,所以,慢慢从简单开始学习吧。这次介绍Frame的一个简单的用法。java最简单的知识之创建一个简单的windows窗口...

技术博客 458

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java 面板切换问题

1、removeAll() public void removeAll() 从此容器中移除所有组件。此方法还通知布局管理器,通过 removeLayoutComponent 方法从此容器的布局中移除这些组件。 2、validate() public void validate() 验证此容器及其所有子组件。

Kilper的专栏 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

(四)抽象类和接口(实例)

转载https://blog.youkuaiyun.com/chajinglong/article/details/78855420 通过对象多态性可以发现,子类发生了向上转型关系之后,所调用的全部方法,都是被覆写过的方法。 abstract class A { public abstract void print(); }; class B extends A{ @Override public void print(){ System.out.println("He

zhangqin__的博客 730

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

java子窗口_java实现点击按钮事件弹出子窗口

本文实例为大家分享了java实现点击按钮事件弹出子窗口的具体代码,供大家参考,具体内容如下要求:1、在父窗口中添加一个按钮2、点击按钮弹出子窗口注意:这是JDK1.7版本在JDK1.7之前,JFrame是不能直接添加子窗口的,要先将JInternalFrame添加到JDesktopPane中,再将JDesktopPane添加到父窗口内,完成这个操作。(一)建立父类JFramepackage com...

weixin_39647186的博客 1330

java关于集合的遍历与增强for循环的使用

java集合类的使用可以说是无处不在,总的我们可以将之分为三大块,分别是从Collection接口延伸出的List、Set和以键值对形式作存储的Map类型集合。      许多情况需要我们遍历出集合中的元素,并做相应的处理。      下面对各种类型的集合的遍历做一些总结,关于增强for循环,需要注意的是,使用增强for循环无法访问数组下标值,对于集合的遍历其内部采用的也是Iterator的相

java4Fun 1万+

java实现多线程下载技术

多线程下载技术,简单的说就是把要下载的文件分成几块,由不同的线程来负责每一块数据的下载任务。         要使用一个随机访问文件的类:RandomAccessFile类,具体用法请参考:http://blog.youkuaiyun.com/java4found/article/details/8656695         具体思路:              1、文件分块。 文件分块大小block

java4Fun 6225

xml文件的dom4j解析

jdom解析:http://blog.youkuaiyun.com/java4found/article/details/8665365 dom解析:http://blog.youkuaiyun.com/java4found/article/details/8665034 sax解析:http://blog.youkuaiyun.com/java4found/article/details/8663214

java4Fun 5577

java_IO流之SequenceInputStream合并流的使用

有些情况下,当我们需要从多个输入流中向程序读入数据。此时,可以使用合并流,将多个输入流合并成一个SequenceInputStream流对象。  SequenceInputStream会将与之相连接的流集组合成一个输入流并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末 尾为止。 合并流的作用是将多个源合并合一个源。 其 可接收枚

java4Fun 5132

java基本数据类型及其封装类

封装,是java这门语言的重要核心思想之一,封装也是对面向对象这一思想很好的体现。      在很多情况下,我们需要对数据进行一些转换,如:将一字符串"123"转换成int类型的123,或者将123转换成"123"这样的字符串,再或者,我们站在对象的角度,获取int类型所能表示的最大整数(Integer.MAX_VALUE)等等这些运用,都要用到基本数据类型的封装类。         原始类型

java4Fun 4321

java实现u盘内容的自动复制

这个小程序的功能是,检查U盘,并将U盘的内容自动拷贝到系统的某个盘符中。分享给大家,就当作是练习io流的小练习。 这个小程序的实现方法如下: 1、程序运行后隔一断时间就检查系统的盘符有没有增加,通过File.listRoots()可获取系统存在的盘符。 2、如果盘符增加了,遍历这个新增加的盘符,用字节流拷贝文件到指定的路径。 需要注意的是,由于U盘的内容可能很大,所以拷贝的

java4Fun 4109
上一篇: java三大框架struts+hibernate+spring学习总结
Sweeter
博客等级 码龄14年 81粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值