Extending a class while hiding access to inherited public method?

A little question about extension technique:
I've designed a custom table/table model which will be used as a company wide resource. The table extends JTable and the model extends AbstractTableModel.
The table and the model are really designed to work together so I've rigged it so that the table will instantiate and assign it's own model in the table constructor. It works well - a user in my company only has to declare and instantiate a table object and doesn't have to worry about the model.
I just noticed however that the getModel() method which I inherited from JTable is public and I cannot override this method with any stricter priviledges. I'm worried that a user may call the getModel() method or setModel() and try to do operations deep in the bowels of my Table. I would really like to hide the internals from any clients of the table.
Is there any way to restrict access to the model elegantly? The only thing I have though of is to override getModel() so it always returns null and then to write my own private getXXXModel() method for my own use. But this would only result in a run-time Null pointer error at best - a compile error would be preferable!

If I were going to do it, I would generally have every
method that you need that is in JTable and essentially
every thing is going to look like this:
public void someMethod() {
hiddenJTable.someMethod();
Generally you shouldn't need to reimplement the
existing methods on JTable. I hope that helps.I'm with dubwai on this one. As he says, provide the methods needed. One option (which I've used) is for you to extend JPanel and have your class add the table to itself in the constructor. Your accessor methods can exactly copy the signature of those in JTable and simply invoke the matching method on the private JTable. This way you can still allow people to place it, resize it, etc like a normal swing component, and you've hidden the methods away that you don't want others to use.
Of course, there are workarounds in the form of getComponent and so on, but they have to work pretty hard to do this. =)

Similar Messages

  • Does extending a class require a hand-entered constructor in superclass?

    Hello,
    Trying to extend a class (which doesn't have a main() method, if this matters), I got the following compiler message
    NewInput.java:1: cannot resolve symbol
    symbol : constructor InputFileDeclared ()
    location: class InputFileDeclared
    public class NewInput extends InputFileDeclared
    After I hand-entered a blank constructor to the superclass the subclass have compiled.
    Doesn't a class have a constructor by default?

    If your class has a contructor which takes arguments, then the compiler does not provide you with a no-arg constructor. In this case if you need to have a constructor that takes no arguments then you need to write one.
    If your base class had a constructor like
    public class InputFileRead {
    //Constructor
    public InputFileRead( String fileName ) {
    //Methods
    and you wrote your Derived class with no constructor as
    public class NewInput extends InputFileRead {
    //No constructors
    //Methods
    Now when you write
    NewInput nInp = new NewInput();
    since you have not written any constructor for your new class the compiler will provide you with a default no-args constructor which will call the default constructor of your base class. Since there is no default constructor for your base class, you won't be able to instantiate the derived class.
    You need to write a no-arg constructor for the new class which will then call the appropriate constructor of the base class.
    public class NewInput extends InputFileRead {
    //Constructor
    public NewInput() {
    super( "InputFile.txt" );
    //Methods
    }

  • Extending a nested class and parent access

    I want the child of the abstract inner class to have access to the inner classes parent's variables. I know that an inner class can access it's parent's variables and methods with the "[ParentClass].this.[var/method]" syntax. What's the appropriate syntax for the situation I'm describing?
    My setup is like this:
    class Canister {
      int a = 0;
      public abstract class Behavior
    class Lonely Behavior extends Behavior
      public int getParentVariable() {
        return Canister.this.a;
    }Thanks!
    -stephen

    The correction to my code is:
    class Canister
      int a = 0;
      public abstract class Behavior
    class LonelyBehavior extends Canister.Behavior
      public int getParentVariable() {
        return Canister.this.a;
    }The compiler doesn't have a problem with me extending Canister.Behavior because it's public inside of Canister. But as I explained, the "[ParentClass].this.[var/method]" syntax doesn't work.
    This is inconsistent with inheritance: you'd think that if you extend an inner class, you would inherit the abilities and characteristics of that inner class, just as you would in other cases of inheritance. It's also inconvenient: if the inner class is abstract because you want programmers to extend and upgrade it, those programmers have to change the source code of the enclosing class to include the new classes.
    Anyway, thanks for the info.

  • Error while extending controller: class name is wrong or not included

    Hi All,
    I am getting this error while I port my extended controller class to the custom top and assign this controller to the page. I have made sure its the class file that is copied. The directory is correct, the permissions were given using chmod 775. There exists a soft link betwen the custom top and the oracle top as well. What else am I missing here?
    Error: oracle.apps.fnd.framework.OAException: Could not create Java class: (oracle.apps.ap.oie.entry.webui.XXEntryFlowPageCO) associated with region: (GeneralInformationPG). This is probably because the class name is wrong or not included in project.

    :( Started out with that Gyan. If i do give the path with xx. appended to it, it lets me save and when i log back in and there are no changes to the page. I go to the personalise option to find the modification has been overwritten. I was told that this is so because Oracle doesnt recognise the xx.path and since there exists a soft link already the standard path with the new controller name should work.
    i have really tried both of these options and am not sure what could be wrong. thanks for all your attempts to help. anything else i can try?

  • AS3.0: How to extend a class that extends MovieClip

    When I try to set the base class of a library symbol to a
    class that doesn't DIRECTLY extend MovieClip, but instead extends
    another class that DOES extend MovieClip, it's disallowed, saying,
    "The class 'Whatever' must subclass 'flash.display.MovieClip' since
    it is linked..."
    Is this just a validation bug in the property windows, only
    checking one class deep into the inheritance hierarchy? Because the
    specified class does extend MovieClip, just two levels in instead
    of one. Is there a fix for this? Or must library symbols always
    directly extend MovieClip? If so, why?

    Which classes from flash.display have you imported. Just
    because a class extends another doesn't mean that it inherits all
    of its properties. Saying a class extends sprite doesn't give you
    access to all of it's properties, members and display unless you
    first import flash.display.* or flash.display.Sprite. If you aren't
    already importing flash.display.*, try importing
    flash.display.MovieClip and see what happens...

  • Invoking a java class while server start up

    Hi,
    I want to invoke a java class/method immediately after a web server is started. Can any body tell me how to do this.
    Regards,
    Prakash

    It is easy.
    Write a serlvet, lets call it ConfigServlet that handles the configuration parameters of a web-application.
    My GenericConfigServlet looks like this:
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Enumeration;
    import java.util.Map;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.log4j.Logger;
    public class GenericConfigServlet extends HttpServlet
         private static final long serialVersionUID = 1L;
         public void init(ServletConfig config) throws ServletException
              super.init(config);
              ServletContext sCtx = getServletContext();
              ServletConfig sCfg = getServletConfig();
                String prefix =  sCtx.getRealPath("/");
                synchronized (this)
                   Enumeration initParams = sCfg.getInitParameterNames();
                   String key, value;
                   GenericConfigProperties.setApplicationBasePath(prefix);
                   while (initParams.hasMoreElements()) {
                        key = (String) initParams.nextElement();
                        value = sCfg.getInitParameter(key);
                        GenericConfigProperties.setProperty(key,value);
    }Then in your web.xml, you write like this:
    <servlet-name>ConfigServlet</servlet-name>
              <servlet-class>GenericConfigServlet</servlet-class>
              <init-param>
                   <param-name>LICENSES</param-name>
                   <param-value>1</param-value>
              </init-param>
              <init-param>
                   <param-name>TMP_DIRECTORY</param-name>
                   <param-value>C:\\temp\\</param-value>
              </init-param>
              <init-param>
                   <param-name>INPUTFILE</param-name>
                   <param-value>C:\\temp\\_input.txt</param-value>
              </init-param>
              <load-on-startup>0</load-on-startup>
         </servlet>You can add any number of init-param-tags.
    The important thing is the element <load-on-startup>0</load-on-startup>. This tells the webserver to load this servlet first. A lower number is loades before a higher so if you have a servlet that you want to load but you need the configuration to be done first, that servlet definition should read <load-on-startup>1</load-on-startup>.
    Of course, you can do anything you want in the init-method. This is just one way of doing it.
    Message was edited by:
    Lajm
    Additionals...
    Message was edited by:
    Lajm
    Hideing company name... ;-)

  • When extending another class...?

    I have made a BinaryTree class, tested it and everything and it all works.
    Now, I have just made an AVLTree class. So, I want all the methods in the BinaryTree class to be the same as in the AVL class except the add method which I wanted to override.
    So, I made the BinaryTree class abstract, and then extended the BinaryTree class in the AVL class.
    So I thought that by doing this all I had to do was put in the add method and change the code and then I could use all the methods in the BinaryTree class.
    Well it seems that I can, except that none of it works correctly because of private attributes. For example, my size doesn't update in my new add method and I can't figure out why. I have a private int size in both classes but it doesn't work. Not only that but my root node isn't working either.
    I'll post some code here and hopefully someone knows what I'm doing wrong.
    package avlTree;
    * @author 383259
    public class AVLTree extends BinaryTree
         private int size;
         private BSTNode root;
         private String side;
         public AVLTree()
              super();
          * @param element
         public AVLTree(Comparable element)
              super(element);
          * @param element
          * @param left
          * @param right
         public AVLTree(Comparable element, BSTNode left, BSTNode right)
              super(element, left, right);
          * @param element
          * @param left
          * @param right
         public AVLTree(Comparable element, BinaryTree left, BinaryTree right)
              super(element, left, right);
    private BSTNode addToTree(Comparable o)
              try
                   boolean status = false;
                   if(isEmpty())
                        System.out.println("yes");
                        status = true;
                        root = new BSTNode(o);
                        size++;
                        setRoot(root);
                        return root;
                   else
                        System.out.println("yes");
                        BSTNode currNode = root;
                        BSTNode newNode = new BSTNode(o);
                        while (status == false)
                             if(newNode.compareTo(currNode.getElement()) == 1)
                                  if (currNode.getRight() == null)
                                       currNode.setRight(newNode);
                                       newNode.setParent(currNode);
                                       size++;
                                       side = "right";
                                       status = true;
                                       return newNode;
                                  else
                                       currNode = currNode.getRight();
                             else if(newNode.compareTo(currNode.getElement()) == -1)
                                  if (currNode.getLeft() == null)
                                       currNode.setLeft(newNode);
                                       newNode.setParent(currNode);
                                       size++;
                                       side = "left";
                                       status = true;
                                       return newNode;
                                  else
                                       currNode = currNode.getLeft();
                             else
                                  status = true;
                                  return null;
                        return null;
                   catch (ClassCastException cce)
                        return null;
                   catch (NullPointerException npe)
                        return null;
                   catch (IllegalArgumentException iae)
                        return null;
         }That private, addToTree method is actually the same as the add method in the binary tree, but is only a small part of the add method in the AVLTree. Anyway, my private root node attribute and size attribute aren't updating for some reason or another, and I cannot figure out why.

    So, I made the BinaryTree class abstract,And you did that why exactly?
    So I thought that by doing this all I had to do was
    put in the add method and change the code and then I
    could use all the methods in the BinaryTree class. Which is correct. Minus the private stuff, as you found out. That's what private means, after all.
    Well it seems that I can, except that none of it
    works correctly because of private attributes. For
    example, my size doesn't update in my new add method
    and I can't figure out why. I have a private int size
    in both classes but it doesn't work. Not only that
    but my root node isn't working either.I guess it doesn't work because you now have two size variables and constantly use the wrong one. Make size protected, or better, provide a protected setter for the size. Do the same for other private attributes you need to access.

  • Error while calling a super class public method in the subclass constructor

    Hi ,
    I have code like this:
    CLASS gacl_applog DEFINITION ABSTRACT.
      PUBLIC SECTION.
        METHODS:
                create_new_a
                   IMPORTING  pf_obj       TYPE balobj_d
                              pf_subobj    TYPE balsubobj
                              pf_extnumber TYPE string
                   EXPORTING  pfx_log_hndl TYPE balloghndl
                   EXCEPTIONS error
    ENDCLASS.
    CLASS gacl_applog IMPLEMENTATION.
      METHOD create_new_a.
        DATA: ls_log TYPE bal_s_log.
      Header aufsetzen
        MOVE pf_extnumber TO ls_log-extnumber.
        ls_log-object     = pf_obj.
        ls_log-subobject  = pf_subobj.
        ls_log-aluser     = sy-uname.
        ls_log-alprog     = sy-repid.
        ls_log-aldate     = sy-datum.
        ls_log-altime     = sy-uzeit.
        ls_log-aldate_del = ls_log-aldate + 1.
        CALL FUNCTION 'BAL_LOG_CREATE'
             EXPORTING
                  i_s_log      = ls_log
             IMPORTING
                  e_log_handle = pfx_log_hndl
             EXCEPTIONS
                  OTHERS       = 1.
        IF ( sy-subrc NE 0 ).
          MESSAGE ID      sy-msgid TYPE sy-msgty NUMBER sy-msgno
                  WITH    sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
                  RAISING error.
        ENDIF.
      ENDMETHOD.
    CLASS gcl_applog_temp DEFINITION INHERITING FROM gacl_applog.
      PUBLIC SECTION.
        DATA: log_hndl   TYPE balloghndl READ-ONLY
            , t_log_hndl TYPE bal_t_logh READ-ONLY
        METHODS: constructor
                   IMPORTING  pf_obj       TYPE balobj_d
                              pf_subobj    TYPE balsubobj
                              pf_extnumber TYPE string
                   EXCEPTIONS error
               , msg_add      REDEFINITION
               , display      REDEFINITION
    ENDCLASS.
    CLASS gcl_applog_temp IMPLEMENTATION.
      METHOD constructor.
        CALL METHOD create_new_a
               EXPORTING  pf_obj       = pf_obj
                          pf_subobj    = pf_subobj
                          pf_extnumber = pf_extnumber
               IMPORTING  pfx_log_hndl = log_hndl.
        IF ( sy-subrc NE 0 ).
          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
                  RAISING error.
        ENDIF.
      ENDMETHOD.
    A public method of Super class has been called from the constructor of the sub class. we are getting the syntax error :
    ' In the constructor method, you can only access instance attributes, instance methods, or "ME" after calling the constructor of the superclass…'
    Can you please suggest how to change the code with out affecting the functioanlity.
    Thank you ,
    Lakshmi.

    Hi,
    Call that method by instance of Subclass.   OR
    SUPER-->method.
    Read very useful document
    Constructors
    Constructors are special methods that cannot be called using CALL METHOD. Instead, they are called automatically by the system to set the starting state of a new object or class. There are two types of constructors - instance constructors and static constructors. Constructors are methods with a predefined name. To use them, you must declare them explicitly in the class.
    The instance constructor of a class is the predefined instance method CONSTRUCTOR. You declare it in the public section as follows:
    METHODS CONSTRUCTOR
            IMPORTING.. [VALUE(]<ii>[)] TYPE type [OPTIONAL]..
            EXCEPTIONS.. <ei>.
    and implement it in the implementation section like any other method. The system calls the instance constructor once for each instance of the class, directly after the object has been created in the CREATE OBJECT statement. You can pass the input parameters of the instance constructor and handle its exceptions using the EXPORTING and EXCEPTIONS additions in the CREATE OBJECT statement.
    The static constructor of a class is the predefined static method CLASS_CONSTRUCTOR. You declare it in the public section as follows:
    CLASS-METHODS CLASS_CONSTRUCTOR.
    and implement it in the implementation section like any other method. The static constructor has no parameters. The system calls the static constructor once for each class, before the class is accessed for the first time. The static constructor cannot therefore access the components of its own class.
    Pls. reward if useful....

  • Creation of developement class,package and access key

    COULD ANYBODY EXPLAIN about
    creation of developement class,package and access key
    and who will create them?

    Working With Development Objects
    Any component of an application program that is stored as a separate unit in the R/3 Repository is called a development object or a Repository Object. In the SAP System, all development objects that logically belong together are assigned to the same development class.
    Object Lists
    In the Object Navigator, development objects are displayed in object lists, which contain all of the elements in a development class, a program, global class, or function group.
    Object lists show not only a hierarchical overview of the development objects in a category, but also tell you how the objects are related to each other. The Object Navigator displays object lists as a tree.
    The topmost node of an object list is the development class. From here, you can navigate right down to the lowest hierarchical level of objects. If you select an object from the tree structure that itself describes an object list, the system displays just the new object list.
    For example:
    Selecting an Object List in the Object Navigator
    To select development objects, you use a selection list in the Object Navigator. This contains the following categories:
    Category
    Meaning
    Application hierarchy
    A list of all of the development classes in the SAP System. This list is arranged hierarchically by application components, component codes, and the development classes belonging to them
    Development class
    A list of all of the objects in the development class
    Program
    A list of all of the components in an ABAP program
    Function group
    A list of all of the function modules and their components that are defined within a function group
    Class
    A list of all of the components of a global class. It also lists the superclasses of the class, and all of the inherited and redefined methods of the current class.
    Internet service
    A list of all of the componentse of an Internet service:
    Service description, themes, language resources, HTML templates and MIME objects.
    When you choose an Internet service from the tree display, the Web Application Builder is started.
    See also Integrating Internet Services.
    Local objects
    A list of all of the local private objects of a user.
    Objects in this list belong to development class $TMP and are not transported. You can display both your own local private objects and those of other users. Local objects are used mostly for testing. If you want to transport a local object, you must assign it to another development class. For further information, refer to Changing Development Classes
    http://help.sap.com/saphelp_46c/helpdata/en/d1/80194b454211d189710000e8322d00/content.htm
    Creating the Main Package
    Use
    The main package is primarily a container for development objects that belong together, in that they share the same system, transport layer, and customer delivery status. However, you must store development objects in sub-packages, not in the main package itself.
    Several main packages can be grouped together to form a structure package.
    Prerequisites
    You have the authorization for the activity L0 (All Functions) using the S_DEVELOP authorization object.
    Procedure
    You create each normal package in a similar procedure to the one described below. It can then be included as a sub-package in a main package.
    To create a main package:
    1.       Open the Package Builder initial screen (SE21 or SPACKAGE).
    2.       In the Package field, enter a name for the package that complies with the tool’s Naming Conventions
    Within SAP itself, the name must begin with a letter from A to S, or from U to X.
    3.       Choose Create.
    The system displays the Create Package dialog box.
    4.       Enter the following package attributes:
    Short Text
    Application Component
    From the component hierarchy of the SAP system, choose the abbreviation for the application component to which you want to assign the new package.
    Software component
    Select an entry. The software component describes a set of development objects that can only be delivered in a single unit. You should assign all the sub-packages of the main package to this software component.
    Exception: Sub-packages that will not be delivered to customers must be assigned to the HOMEsoftware component.
    Main Package
    This checkbox appears only if you have the appropriate authorization (see Prerequisites).
    To indicate that the package is a main package, check this box.
    5.       Choose  Save.
    6.       In the dialog box that appears, assign a transport request.
    Result
    The Change package screen displays the attributes of the new package. To display the object list for the package in the Object Navigator as well, choose  from the button bar.
    You have created your main package and can now define a structure within it. Generally, you will continue by adding sub-packages to the main package. They themselves will contain the package elements you have assigned.
    See also
    Adding Sub-Packages to the Main Package
    http://help.sap.com/saphelp_nw04/helpdata/en/ea/c05d8cf01011d3964000a0c94260a5/content.htm
    access key used for change standard program.
    www.sap.service.com

  • Loading external swfs extending from classes in the same shared codebase

    Hey there!
    I'm currently developing a game in flash and want to be able to divide up my .fla assets in a way that means artists can work on a game menu .fla in isolation from the game.fla and rest of the game code.
    If I could briefly explain how I've approached this so far, I would be extremely if people could shout in my general direction and tell me I am stupid, or even better still, give me helpful advice as to where I am going wrong and how I can correct it!
    My project is setup like this:
    HighScoreMenu.fla -> document class HighScoreMenu extending GameMenu class.
    game.fla ->document class game.as
    game.as class loads the published HighScoreMenu.swf and manipulates the menu i.e. animates on and off screen via inherited functions in the GameMenu class.
    Now this seemed to work to begin with, until my code evolved and upon going to publish my HighScoreMenu.fla flash started complaining about symbols being used in Game.as that were in Game.fla...  If I'm only publishing the HighScoreMenu which extends from GameMenu then why is it even looking to compile Game.as?
    Can you spot the problem in the way I am doing this, or is there a better approach I should try?
    Any advice greatly appreciated!
    Stevie.

    No it doesn't seem to, however though they both have a reference to the HighScoreManager so there is some overlap there between menu and game code, but the menu classes don't reference any symbols on the game.fla...
    Just to clarify, I have an fla HighScoreMenu.fla, which has a child symbol HighScoreMenu which uses the following class.
    public dynamic class HighScoreMenu extends GameMenu
         //convenient storage for competition Manager object
         private var _highScoreManager:HighScoreManager;
    The game then loads this class as follows:
    I load the swf "HighScoreMenu.swf" and once its loaded I obtain the menu class like so:
    var cls:Class = Class( applicationDomain.getDefinition("Menus.HighScoreMenu") );
    var object:* = new cls();
    ...and create a new instance of the menu.
    Is there anything fundamentally wrong with approaching it in this way?

  • Error #1009 while loading swf "Cannot access a property or method of a null object reference."

    Hello
    I'm trying to load a swf called "polaroids.swf" into my main swf called "09replacesSWF.swf". I keep getting the error when I test the movie. I'm completely lost and have been at this for hours. If I just test polaroids.fla the movie works fine but if I try to load it into 09replacesSWF.swf, I get the error. I need some help PLEASE!!!!!
    I tried to debug the movie and flash says......."Cannot display source code at this location".
    ....... TypeError: Error #1009: Cannot access a property or method of a null object reference.
        at Polaroids$iinit()
    Here is my AS code
    package {
        import flash.display.*;
        import flash.filters.*;
        import flash.utils.*;
        import flash.net.*;
        import flash.events.*;
        import flash.filters.DropShadowFilter;
        import caurina.transitions.*;
        public class Polaroids extends MovieClip {
            //Variables
            public var stageContainer:MovieClip;
            private var _scaleTempo:Number;
            private var _thumbStr:Number;
            private var _stageHeight:Number;
            private var _stageWidth:Number;
            private var _count:Number;
            private var _initBGHeight:Number;
            private var _initBGWidth:Number;
            //Arrays
            private var _backgroundImageArr:Array;
            private var _imageURLArr:Array;
            private var _imageCaptionArr:Array;
            private var _imagesArr:Array;
            //Bitmaps
            private var _image:Bitmap;
            private var _backgroundImage:Bitmap;
            private var _bitmap:BitmapData;
            private var _backgroundBitmap:BitmapData;
            //XML
            private var _xmlLoader:URLLoader;
            private var _imageXML:XML;
            //Holders
            private var _imageContainer:ImageContainer;
            private var _backgroundImageHolder:MovieClip;
            //Image States
            private var _activeImage = null;
            private var _previousActiveImage = null;
            //Loaders
            private var backgroundImageLoader:Loader;
            public function Polaroids() {
                //sets up initial variable values
                _count = 0;
                _backgroundImageArr=new Array;
                _imageURLArr=new Array;
                _imageCaptionArr=new Array;
                _imagesArr=new Array;
                _scaleTempo=9;
                _thumbStr = .3;
                backgroundImageLoader = new Loader();
                _stageHeight=stage.stageHeight;
                _stageWidth=stage.stageWidth;
                _backgroundImageHolder = new MovieClip();
                stageContainer = new MovieClip();
                addChild(stageContainer);
                init();
            //Add Stage Listener
            private function addedToStage(e:Event):void {
                stage.addEventListener(Event.RESIZE, onResize);
            Initialise
            private function init():void {
                //Setup stage
                stage.align     = StageAlign.TOP_LEFT;
                stage.scaleMode = StageScaleMode.NO_SCALE;
                //Load XML
                var _xmlLoader:URLLoader=new URLLoader;
                _xmlLoader.load(new URLRequest("photos.xml"));
                _xmlLoader.addEventListener(Event.COMPLETE,processXML);
                this.addEventListener(Event.ADDED_TO_STAGE, addedToStage);
            Process XML
            private function processXML(e:Event):void {
                _imageXML=new XML(e.target.data);
                _backgroundImageArr[0] = _imageXML.@backgroundImage;
                for (var i:int=0; i < _imageXML.*.length(); i++) {
                    _imageURLArr[i]=_imageXML.image[i].@url;
                    _imageCaptionArr[i]=_imageXML.image[i].@caption;
                loadImages();
                loadBackgroundImage();
            Load Background Image
            private function loadBackgroundImage():void {
                backgroundImageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,addBack ground);
                backgroundImageLoader.load(new URLRequest(_backgroundImageArr[0]));
            Add background image to stage
            private function addBackground(e:Event):void {
                _backgroundImage=Bitmap(e.target.content);
                _backgroundBitmap=_image.bitmapData;
                _backgroundImage.smoothing = true;
                _backgroundImageHolder.addChild(_backgroundImage);
                _initBGHeight = backgroundImageLoader.contentLoaderInfo.height;
                _initBGWidth = backgroundImageLoader.contentLoaderInfo.width;
                if ((_initBGWidth/_initBGHeight) > (stage.stageWidth/stage.stageHeight)) {
                    _backgroundImageHolder.height = stage.stageHeight;
                    _backgroundImageHolder.width =  _backgroundImageHolder.height * _initBGWidth / _initBGHeight;
                } else {
                    _backgroundImageHolder.width = stage.stageWidth;
                    _backgroundImageHolder.height= _backgroundImageHolder.width * _initBGHeight / _initBGWidth;
            Load Images
            private function loadImages():void {
                for (var i:int=0; i < _imageURLArr.length; i++) {
                    var imageLoader:Loader=new Loader;
                    imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,addImage);
                    imageLoader.load(new URLRequest(_imageURLArr[i]));
            Add images to MovieClip on Stage
            private function addImage(e:Event):void {
                _image=Bitmap(e.target.content);
                _bitmap=_image.bitmapData;
                _image.smoothing = true;
                _imageContainer = new ImageContainer();
                _imageContainer.falseBtn.buttonMode = true;
                _imageContainer.falseBtn.doubleClickEnabled = true;
                _imageContainer.imageHolder.addChild(_image);//Add Bitmap to a MoviClip _imageContainer
                _image.x = _imageContainer.width/2 - (_image.width/2 + 15);
                _image.y = _imageContainer.height/2 - (_image.height/2 + 80) ;
                _imageContainer.imageCaption.text = _imageCaptionArr[_count];
                _imageContainer.scaleX = _thumbStr;
                _imageContainer.scaleY = _thumbStr;
                _imageContainer.rotation = 30 - 60 * Math.random();
                if (Math.round(Math.random() * 1) == 1) {
                    _imageContainer.y=stage.stageHeight * Math.random() + _imageContainer.height * 2;
                    if (Math.round(Math.random() * 1) == 1) {
                        _imageContainer.x=stage.stageWidth + _imageContainer.width * 2;
                    } else {
                        _imageContainer.x=- _imageContainer.width * 2;
                } else {
                    _imageContainer.x=stage.stageWidth * Math.random() + _imageContainer.width * 2;
                    if (Math.round(Math.random() * 1) == 1) {
                        _imageContainer.y=stage.stageHeight + _imageContainer.height * 2;
                    } else {
                        _imageContainer.y=- _imageContainer.height * 2;
                //Setup Attributes
                _imageContainer.newX = Math.round((_imageContainer.width/2) + (stage.stageWidth-_imageContainer.width)*Math.random());
                _imageContainer.newY = Math.round((_imageContainer.height/2) + (stage.stageHeight-_imageContainer.height)*Math.random());
                _imageContainer.oldRotation = _imageContainer.rotation;
                _imageContainer.oldX = _imageContainer.newX;
                _imageContainer.oldY = _imageContainer.newY;
                _imageContainer.startX = _imageContainer.x;
                _imageContainer.startY = _imageContainer.y;
                _imageContainer.oldHeight = _imageContainer.scaleY;
                _imageContainer.oldWidth = _imageContainer.scaleX;
                _imageContainer.id = _count;
                _imageContainer.addEventListener(Event.ENTER_FRAME, animateImage);
                _imageContainer.addEventListener(MouseEvent.MOUSE_DOWN,dragImage);
                _imageContainer.addEventListener(MouseEvent.MOUSE_UP,dropImage);
                _imageContainer.addEventListener(MouseEvent.MOUSE_OUT, dropImage);
                _imageContainer.falseBtn.addEventListener(MouseEvent.DOUBLE_CLICK, setup_activeImage);
                _imagesArr.push(_imageContainer);//Add image reference to an Array
                _imageContainer.filters = [new DropShadowFilter(0,0,0,.9,8,8,1,1,false,false)];
                //Button Listeners
                _imageContainer.nextBtn.visible = false;
                _imageContainer.previousBtn.visible = false;
                _imageContainer.nextBtn.buttonMode = true;
                _imageContainer.previousBtn.buttonMode = true;
                _imageContainer.nextBtn.addEventListener(MouseEvent.MOUSE_DOWN, nextImage);
                _imageContainer.previousBtn.addEventListener(MouseEvent.MOUSE_DOWN, previousImage);
                //Add Container to Stage
                addChild(_imageContainer);
                stageContainer.addChild(_imageContainer);
                _count++;
            Animate Images onto Stage
            private function animateImage(e:Event):void {
                e.target.y += (e.target.newY - e.target.y) / _scaleTempo;
                e.target.x += (e.target.newX - e.target.x) / _scaleTempo;
                if (Math.round(e.target.y) == e.target.newY) {
                    e.target.removeEventListener(Event.ENTER_FRAME, animateImage);
            Drag & Drop Images
            private function dragImage(e:MouseEvent) {
                if (e.currentTarget != _activeImage) {
                    e.currentTarget.startDrag();
                    if (_activeImage == null) {
                        stageContainer.setChildIndex(DisplayObject(e.currentTarget), stageContainer.numChildren-1);
                    } else {
                        stageContainer.setChildIndex(DisplayObject(e.currentTarget), stageContainer.numChildren-2);
            private function dropImage(e:MouseEvent) {
                if (e.currentTarget != _activeImage) {
                    e.currentTarget.stopDrag();
                    e.currentTarget.oldX = e.currentTarget.x;
                    e.currentTarget.oldY = e.currentTarget.y;
            onResize Handler
            private function onResize(e:Event):void {
                for (var i:int = 0; i<_imagesArr.length; i++) {
                    if (_imagesArr[i] != _activeImage) {
                        _imagesArr[i].x = Math.round(stage.stageWidth * (_imagesArr[i].x/_stageWidth));
                        _imagesArr[i].y = Math.round(stage.stageHeight * (_imagesArr[i].y/_stageHeight));
                    } else {
                        _activeImage.x = stage.stageWidth/2;
                        _activeImage.y = stage.stageHeight/2;
                    _imagesArr[i].oldX = Math.round(stage.stageWidth * (_imagesArr[i].oldX/_stageWidth));
                    _imagesArr[i].oldY = Math.round(stage.stageHeight * (_imagesArr[i].oldY/_stageHeight));
                    _imagesArr[i].newX = Math.round(stage.stageWidth * (_imagesArr[i].newX/_stageWidth));
                    _imagesArr[i].newY = Math.round(stage.stageHeight * (_imagesArr[i].newY/_stageHeight));
                    _imagesArr[i].startX = Math.round(stage.stageWidth * (_imagesArr[i].startX/_stageWidth));
                    _imagesArr[i].startY = Math.round(stage.stageHeight * (_imagesArr[i].startY/_stageHeight));
                //Background Resizer
                if ((_initBGWidth/_initBGHeight) > (stage.stageWidth/stage.stageHeight)) {
                    _backgroundImageHolder.height = stage.stageHeight;
                    _backgroundImageHolder.width =  _backgroundImageHolder.height * _initBGWidth / _initBGHeight;
                } else {
                    _backgroundImageHolder.width = stage.stageWidth;
                    _backgroundImageHolder.height= _backgroundImageHolder.width * _initBGHeight / _initBGWidth;
                _stageWidth = stage.stageWidth;
                _stageHeight = stage.stageHeight;
            Handle Selected Image
            private function zoomImage():void {
                stageContainer.setChildIndex(_activeImage, stageContainer.numChildren-1);
                Tweener.addTween(_activeImage,{scaleX: 1, scaleY: 1, rotation: 0, x: _stageWidth/2 , y: _stageHeight/2, time: 1});
                _activeImage.nextBtn.visible = true;
                _activeImage.previousBtn.visible = true;
            private function returnImage():void {
                stageContainer.setChildIndex(_previousActiveImage, stageContainer.numChildren-2);
                Tweener.addTween(_previousActiveImage,{scaleX: .3, scaleY: .3, rotation: _previousActiveImage.oldRotation, x: _previousActiveImage.oldX , y: _previousActiveImage.oldY, time: 1});
                _previousActiveImage.nextBtn.visible = false;
                _previousActiveImage.previousBtn.visible = false;
            private function setup_activeImage(e:Event):void {
                if ((_activeImage == null) && (_previousActiveImage == null)) {
                    _activeImage = e.currentTarget.parent;
                    zoomImage();
                } else if (e.currentTarget.parent != _activeImage) {
                    _previousActiveImage = _activeImage;
                    _activeImage = e.currentTarget.parent;
                    zoomImage();
                    returnImage();
                } else {
                    Tweener.addTween(_activeImage,{scaleX: .3, scaleY: .3, rotation: _activeImage.oldRotation, x: _activeImage.oldX , y: _activeImage.oldY, time: 1});
                    _activeImage.nextBtn.visible = false;
                    _activeImage.previousBtn.visible = false;
                    _activeImage = null;
                    _previousActiveImage = null;
            Button Handlers
            private function nextImage(e:MouseEvent):void {
                var imageID = int(e.currentTarget.parent.id);
                if (imageID < _imagesArr.length - 1) {
                    _previousActiveImage = e.currentTarget.parent;
                    _activeImage = _imagesArr[imageID+1];
                    zoomImage();
                    returnImage();
                } else {
                    _previousActiveImage = e.currentTarget.parent;
                    _activeImage = _imagesArr[0];
                    zoomImage();
                    returnImage();
            private function previousImage(e:MouseEvent):void {
                var imageID = int(e.currentTarget.parent.id);
                if (imageID != 0) {
                    _previousActiveImage = e.currentTarget.parent;
                    _activeImage = _imagesArr[imageID-1];
                    zoomImage();
                    returnImage();
                } else {
                    _previousActiveImage = e.currentTarget.parent;
                    _activeImage = _imagesArr[_imagesArr.length-1];
                    zoomImage();
                    returnImage();
    }

    Raymond,
    The error is at line 55....when I debug
    TypeError: Error #1009: Cannot access a property or method of a null object reference.
        at Polaroids$iinit()[/Volumes/Herman's Passport/Music Rocka/RockaGallery/Polaroids.as:55]
    So i'm looking in the code.....

  • Inner classes can't access parent classes in constructor

    I'm having a problem where I have class A, which has an Inner class B, which has it's own inner class C. In C's constructor (the inner most class), i'm trying to access a method of A (the top most class), and I get a NullPointerException with trace:
    at mearns.finance.DefaultPortfolio.access$0(DefaultPortfolio.java:1)
    at mearns.finance.DefaultPortfolio$AccountsEditor$AccountsTableModel.<init>(DefaultPortfolio.java:253)
    In this case "DefaultPortfolio" is class A, AccountsEditor is class B, and AccountsTableModel is class C. The line given in the second stack trace element is the line in C's constructor which calls Class A's method.
    Debugging, I stop inside C's constructor. Before anything happens, debugger says this$1 is null. Then I step, and it calls super(), and now this$1 is an instance of class B (AccountEditor), but it's own this$1 (which should be an instance of class A) is still null.
    I'm calling C's constructor from within B's constructor (but not A's), not sure if that makes a difference.
    Can anyone explain what's going on here, and (hopefully) how I can work around it?
    Thanks for any help.
    When i debug

    hm, I really don't know what is happening but I want to tell you about something that is not nice in your code and possibly it could cause the error.
    Code behaves somwhat strange when you pass this out of a constructor. You do this implicitly when you create an inner classe which implicitly gets a reference to the outer class. Also just simple method calls can cause such effects.
    This is because the construction process it not finished but methods are already called.
    Even worse: the sub classes constructor possibly did not even start. Special to java is the fact that a method call can lead to an overridden method of a sub class who's constructors has not even passed the super() command.
    My guess now is that you have that some kind of this situation in your code. You create an inner class in a constructor. That inner class calls back a method on the outer class. Now say that the method you are calling is defined in a sub class who's constructor still stucks in super() call. There we are.
    I found a thread in a news group that covers exactly this problem:
    It is therefore a good idea only to call private methods from constructors (that should then also call only private methods). Also if inner classes are created in the constructor then they should not call any non trivial / non private methods of the outer class. Calling overridden methods out of constructors should be avoided strictly!
    Perhaps this has nothing to do with your problem. I cannot tell for sure.
    But this sounds quite interesting.
    Please tell me if my guess was right and if not post simple code the illustrated your problem.
    Here a simple example also throwing NullPointerException:
    class Outer {
      int i = 42;
      abstract class InnerSuper {
        InnerSuper() {
          foo();
        abstract void foo();
      class InnerSub extends InnerSuper {
        void foo() {
          System.out.println(i);
      public void bar() {
        new InnerSub();
      public static void main(String[] args) {
        Outer o = new Outer();
        o.bar();
    } It causes a NullPointerException because the InnerSub constructor did not run. I copied the example from a news group thread i found.
    http://groups.google.de/group/comp.lang.java.programmer/browse_thread/thread/897fba792d689b29/a1ba2ed708636a30?q=inner+class+outer+this+reference+NullPointerException&rnum=4&hl=de#a1ba2ed708636a30
    Here is a even simpler example of strange behavior - even without NullPointerExceptions.
    class A {
         A() {
              System.out.println(getName());
         String getName() {
              return "A";
    class B extends A {
         String NAME = "B";
         String getName() {
              return NAME;
    new B();It will output null instead of B.
    regards
    Sven

  • Searching for extended ABAP Classes documentation

    Hi,
    I'm a newbie to this forum (perhaps I'm a newbie in an abap too - with my 1.5 yrs abaping) but I'm interested in a few topics related to classes available in the repository:
    1. Where can I find full and detailed info (means description of interfaces both public and private/static) on classes included in a dev.class SLIS, SCET, especially specific ones - currently I'm looking for a documentation on class <cl_alv_changed_data_protocol>, because the info supplied in the repository is not so obviously clear for me.
    2. Can someone point me to a SAP cource/academy -name(s) related to the public classes related to a gui programming and!!!! their support-classes (such as mentioned one above) - which is most important.
    3. (specific question) In the OO framework(s) I worked with in my background there was a possibility to 'extend' some class' behaviour (usualy adding interface). Is there any possibility in a SAP environment to do this and if yes where can I find a docu/info on how to achieve this? Is this achieved only with a related access key?
    4. Please could someone provide me a dev.class names with demo-programs (such as SLIS, SCET) related (mostly) to a GUI-programming?
    Perhaps checking the source of the demo-reports supplied in these dev.classes would help me, but occasionaly it's a bit more complicated and time-consuming than to check a related docu, isn't it?
    The info-sources I have (and used widely) are:
    a) html-documentation with my (ok, our) installation > 4.6C (both integrated into an environment and CHM-help).
    b) 'Controls Technology - Workbench edition' - which I would recommend to all the programmers interested in this area.
    c) 'An Easy Reference for ALV Grid Control'  by Serdar SIMSEKLER (BTW, thank you very, very much Serdar! for providing this reference to the public, I found it very usefull)
    d) of cource, the Class Builder via Repository Browser (se80) which usually and unfortunately doesn't report me any class information when asked.
    e) occasionaly google-ing the world with a specific question and checking this fourm or some related one(s) in the sap community and in de.alt.comp.sap-r3 newsgroup (unfortunately for me the last one is basicaly with postings in German, which makes it unusable to me).
    Perhaps most of you would agree there is a lack of information on these topics. Or, of course, I'm still a newbie and don't know how/where to find it
    Please note, answers in sort of 'Feel free to ask with a specific question here...' are not the answer(s) I'm looking for I know this possiblilty and am using it :-).
    Finaly, one question off topic and related mostly to the moderators:
    Is there an intention or even better a possibility to achieve this forum via NNTP-protocol (means using a standard news-client)? It would be great for me if it's possible or is intended to become possible - I'm using a news-client to track few newsgroups (forums) and it would be great not to switch to a different browser to track this one, which is IMHO the best english-speaking abap-related forum.
    Many thanks in advance.
    Best Regards,
    Ivaylo Mutafchiev
    BC Consultant - Abap developer
    VBS Ltd.
    Varna. Bulgaria
    Message was edited by: Ivaylo Mutafchiev

    From within SE80 choose menu Environment->Controls Examples.  This will lead you to many fine Enjoy Control Example programs.
    Also SAP had a class several years ago called BC412 ABAP Dialog Programming Using EnjoySAP Controls.  It might still be around in some format.

  • Extending abstract classes

    I just have a simple question. I have one class which is abstract
    public abstract class Person
         private String firstName;
         private String lastName;
         private String title;
         private String dateOfBirth;
         private String homeAddress;
         private String phoneNumber;
         public static final String MR = "Mr";
         public static final String MISS = "Miss";
         public static final String MS = "Ms";
         public static final String MRS = "Mrs";
         public static final String DR = "DR";
         public static final String PROF = "Prof";
         public Person(String firstName, String lastName, String title, String dateOfBirth,
                         String homeAddress, String phoneNumber){
              this.firstName=firstName;
              this.lastName=lastName;
              this.title=title;
              this.dateOfBirth=dateOfBirth;
              this.homeAddress=homeAddress;
              this.phoneNumber=phoneNumber;
         And i have another class which extends this class
    public abstract class Borrower extends Person{
      public LibraryItem [] itemsBorrowed;
      private double currentFine;
      private int barCode;
      public LibraryItem [] getItemsBorrowed()
           return itemsBorrowed;
      public double getCurrentFine()
           return currentFine;
      public int getBarCode()
           return barCode;
      }When i try to compile these two classes, i get the error
    Cannot find symbal constructor Person(). The problem is that the tutor hates us providing default constructors, and i presume that this is what the error is asking for. Is there any way around this or does a default constructor need to be povided?
    cheers

    codingMonkey wrote:
    georgemc wrote:
    nick2price wrote:
    Ok, i get you, better call the superclass constructor as tutor hates me using no param constructorsChallenge him on that. Not only are they perfectly acceptable, they're a mandatory part of the JavaBeans spec.Personally, even though there are nothing wrong with them, I prefer to avoid no-arg constructors in a lot of cases. Usually when I feel that a class should always have certain attributes. I.e. instead of having a no-arg constructor for something like a Person class, I'd rather have a constructor that takes at least a name. It is true that the name could always be initialized in the no-arg constructor, but I would think that it makes more sense for a person to always have a name, rather than being called "null" or "N/A".If you plan on using any framework that uses the Beans spec (and while the inexperienced, self-professed "purist" might balk at that, you'll find it virtually impossible to avoid as a commercial coder) you won't be able to with those classes. Your argument about always needing a sensible starting point falls down where you have multiple disparate types that you are re-constructing. While it's quite nice to say "a Person should always have a Name", if you have, for example, a persistence framework that will generically map the results of various database queries back onto Java objects, you have to write some special case code for each class in your domain model, that says "in order to contruct this object, you first need to perform this query, then invoke this constructor with this part of the result of that query, then populate the rest of the properties using setter methods". For every class in your domain model. That's a fair amount of overhead. The no-args constructor model completely circumvents that, since everything's populated by the same generic code - beans introspection. Think about it. For every class in your model, you have to have separate chunks of code that are aware of - and hence, coupled to - a specific query, and a specific constructor of a specific class. Far from ideal.
    Even if you decide to roll your own code to manage peristence, configuration, remoting and the like, you'll still eventually settle on no-args constructors as extremely handy tools. Note that I'm all for the presence of other constructors as well, that do allow sensible creation of objects with certain values. Just that the no-args constructor is so infinitely useful for writing a huge amount of generic code
    I would think that it makes more sense for a person to always have a name, rather than being called "null" or "N/A".Me too. And there's nothing in any of my points that gainsays, or opposes that. You create a Person instance, and he's called "null" for a few clock cycles before you populate him from a database query - nothing wrong with that

  • About access specifiers (inheritance)

    abstract Class A
    abstract public add();
    Class B extends A
    protected add() //this wont work
    //some code here
    The access specifier for add method in A is public ,and in B is protected.This is not allowed by compiler.
    Why cant we make the access weaker in the sub class?What is the drawback in allowing to make the access weaker.

    Because any class that uses class A has the right to expect to use the add() method, since it is public in A. Since B is an A, it must allow some one to use an instance of B as if it were an A.

Maybe you are looking for