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


    时间紧张,先记一笔,后续优化与完善。

             今天一同窗问我,如何在一个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是子窗口,其继承它的子类必然也是一个子窗口对象。

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

        

    文章结束给大家分享下程序员的一些笑话语录: 不会,Intel会维持高利润,也会维持竞争局面,国外的竞争不是打死对方的那种。你看日本有尼康,佳能,索尼,都做相机,大家都过得很滋润。别看一堆厂,其实真正控制的是后面的那几个财团——有些竞争对手,后面其实是一家人。

    --------------------------------- 原创文章 By
    子窗口和切换
    ---------------------------------

  • 相关阅读:
    为php5.6.30安装redis扩展
    Laravel利用pusher推送消息
    php闭包使用例子
    利用反射给类中方法加钩子
    mysql删除重复记录
    DB门面,查询构建器,Eloquent ORM三者的CURD
    Laravel5.1之表单验证
    服务提供者及门面
    批量搜索并替换内容
    Laravel之Elixir
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3106619.html
Copyright © 2020-2023  润新知