java Swing实现JPanel面板的继承

  最近在公司在老大的引领下实验着用Swing设计一套GUI应用开发的快速开发模式,具体说就是开发一套常用的组件库,让任何一个非编程人员在适当培训下都可以通过拖曳的方式以及一些傻瓜化的属性设置就可以完成一套业务流程。譬如要在终端机开发手机话费充值流程,包括输入手机号码(包括合法性校验等)-->选择充值类型金额-->信息确认-->插入银行卡-->卡密校验等等一系列流程,设计人员就可以快速完成整套流程,然后交付编程人员补充业务逻辑完成真实交易。
   组件化,快速开发等最大要求就是要最大的重用。在我们要应用的业务流程中,每一个关联的界面往往都是大部分是相同的,如左侧导航,顶部banner都是相同的,而变化的只有一小部分,也就是真正的流程变换。这样最好的方式就是有一个公有的模板,而以后每一个流程继承这个模板类实现自己那一小部分就OK了。然而Swing的JPanel不支持直接的继承。为了解决这个问题,老大重写了javax.swing.JPanel,下面越厨代庖分享一下。

RootPaneContainerBase.java,也就是他代替我的JPanel了
package com.hotye.terminal.components.base;

import java.awt.Component;
import java.awt.Container;
import java.awt.LayoutManager;
import javax.swing.JLayeredPane;
import javax.swing.JRootPane;
import javax.swing.RootPaneContainer;

public abstract class RootPaneContainerBase extends javax.swing.JPanel implements RootPaneContainer {


    @Override
    public void setLayout(LayoutManager mgr) {
        if(getRootPane() != null)
            getContentPane().setLayout(mgr);
        else
            super.setLayout(mgr);
    }

    @Override
    public Component add(Component comp) {
        if(getRootPane() != null)
            return getContentPane().add(comp);
        else
            return super.add(comp);
    }

    @Override
    public void add(Component comp, Object constraints) {
        if(getRootPane() != null)
            getContentPane().add(comp, constraints);
        else
            super.add(comp, constraints);
    }

    @Override
    public Component add(String name, Component comp) {
        if(getRootPane() != null)
            return getContentPane().add(name, comp);
        else
            return super.add(name, comp);
    }

    @Override
    public Component add(Component comp, int index) {
        if(getRootPane() != null)
            return getContentPane().add(comp, index);
        else
            return super.add(comp, index);
    }

    @Override
    public void add(Component comp, Object constraints, int index) {
        if(getRootPane() != null)
            getContentPane().add(comp, constraints, index);
        else
            super.add(comp, constraints, index);
    }

    @Override
    public void remove(Component comp) {
        if(getRootPane() != null)
            getContentPane().remove(comp);
        else
            super.remove(comp);
    }

    @Override
    public void remove(int index) {
        if(getRootPane() != null)
            getContentPane().remove(index);
        else
            super.remove(index);
    }

    @Override
    public void removeAll() {
        if(getRootPane() != null)
            getContentPane().removeAll();
        else
            super.removeAll();
    }

    public void setContentPane(Container contentPane) {
        getRootPane().setContentPane(contentPane);
    }

    public void setLayeredPane(JLayeredPane layeredPane) {
        getRootPane().setLayeredPane(layeredPane);
    }

    public JLayeredPane getLayeredPane() {
        return getRootPane().getLayeredPane();
    }

    public void setGlassPane(Component glassPane) {
        getRootPane().setGlassPane(glassPane);
    }

    public Component getGlassPane() {
        return getRootPane().getGlassPane();
    }

    public Container getContentPane() {
        return getRootPane().getContentPane();
    }

    /**
     * return the RootPane of this component, must be override in child class
     */
    @Override
    public abstract JRootPane getRootPane();

}



DemoTemplate.java(公共模板父类DEMO)
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JRootPane;

/**
 *重写父类的getRootPane()方法以及在构造函数中初始化是必须的
 * @author Chiang
 */
public class DemoTemplate extends RootPaneContainerBase {

    private JRootPane rootPane;

    public DemoTemplate() {
        initComponents();

         rootPane = new JRootPane();
        rootPane.setOpaque(true);

        mainContainerPane.setLayout(new BorderLayout());
        mainContainerPane.add(rootPane);
    }

  
    private void initComponents() {

       //设计器生成的代码。。。省略掉
	   
    }

    @Override
    public JRootPane getRootPane() {
       return rootPane;
    }

    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JPanel mainContainerPane;

     
     public static void main(String[] args) {
             java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame main = new JFrame();
                main.setSize(400, 300);
                main.setResizable(false);
                main.getContentPane().setLayout(new BorderLayout());
                main.getContentPane().add( new DemoTemplate() );

                main.setVisible(true);
            }
        });
    }
}


下面直接new 一个JPanel Form面板,手动修改继承父类DemoTemplate,然后就可以在下方区域添加需要的组件了,你会发现顶部公共部分是不允许添加的。。。。(如图)
java Swing实现JPanel面板的继承

你可能感兴趣的:(java,设计模式,编程,swing)