questions about the implications of multiple JFrames using dispose() on closing

Discussion in 'Java' started by rfractal30, Apr 11, 2005.

  1. rfractal30

    rfractal30 Guest

    Hi

    I've come up against some perplexing questions caused by the creation
    of multiple instances of JFrame.

    obj is referencing a JButton click. This then loads a FileDialog for
    opening an image and displaying it in an extended JFrame called
    'ResizeFrame'. JFrame then loads a panel which displays the Image. The
    code as it stands allows multiple instances of ResizeFrame.

    ResizeFrame basically does most of the work and calls methods to load
    the Image - which has been opened in it - to be drawn in ResizePanel.

    ResizeFrame is coded to 'dispose' on closing.

    What I am trying to understand is what happens when a frame is opened,
    then closed, and then a new frame is opened. Does the instance of
    ResizeFrame (all named the same) that was initially opened, still
    exist, or has it been over-written by the new version.

    Am I making a mistake allowing several JFrames to be opened at once? I
    know that when a frame is disposed that its claims on screen resourses
    are freed up - but if it is still existing even after it has been
    disposed it must still be using some memory resources?

    Also, what are the implications of having several objects existing with
    the same name?

    Another thing I've noticed. My ResizeFrame has a method for loading a
    panel and then is made visible within ResizeFrame. What I've noticed is
    that if I load a ResizeFrame Image, then close it, then open up the
    same image file - that the picture will appear much faster than if I
    open up a different image. I'm not understanding how this is happening!

    I could change my code so that it is only possible to have 1
    ResizeFrame open at a time - however this would require a considerable
    amount of simplification (i.e. beyond my hackish skills!). I would only
    do it if I am convinced that the way I have done things is BAD with a
    capital B (which it probably is - but then I am a very inexperienced
    programmer).

    Thanks for any advice.

    Michael


    //-----------------------------
    if (obj == newdepth) {
    File f = loadimage("depth\\", FileDialog.LOAD);
    if (!(f == null)) {
    File q = new File(f.getParent());
    if (q.isDirectory()) {
    String w = f.getPath();
    p.LoadPic(w);
    ResizeFrame jeff = new ResizeFrame((w + " - Depth Map"), new
    Color(205, 219, 227), false);
    jeff.LoadPic(w);
    jeff.addpanel();
    }
    else {
    status.setText("invalid directory");
    }
    }
    }
    //--------------------------------


    //--I've included the full code for ResizeFrame and ResizePanel hoping
    for constructive critism. Also, it might help to make my questions
    clearer.

    //-----------ResizeFrame----------
    import java.awt.*;
    import javax.swing.*;
    import myroot.frames.*;
    import java.awt.event.*;

    import java.io.*;
    import java.awt.image.*;


    import osbaldeston.image.BMP;

    public class ResizeFrame extends JFrame implements ImageObserver {
    public Image myimage;
    public ResizePanel mypanel;
    public Color col;
    public boolean resizing;



    public void LoadPic(String inpic){
    myimage = null;

    int typepic = getTypePic(inpic);


    if (typepic == 1) {
    BMP dave = new BMP(new File(inpic));
    myimage = dave.getImage();
    }
    if (typepic == 2) {
    myimage = Toolkit.getDefaultToolkit().getImage ( inpic);
    }


    WaitImage(myimage);

    }

    public int getTypePic(String in) {
    if (in.length() > 4) {
    String test = in.substring(in.length() - 4, in.length());
    test = test.toLowerCase();

    if (test.equals(".bmp")) return 1;
    if (test.equals(".gif")|| test.equals(".png") ||
    test.equals(".jpg") || test.equals("jpeg")) return 2;

    }
    return 0;
    }
    public void WaitImage(Image im) {
    boolean wait = true;
    wait = ImageUtilities.waitForImage(im, this);
    }

    public void addpanel() {
    if (resizing == true)
    setExtendedState(Frame.MAXIMIZED_BOTH);
    mypanel = new ResizePanel(myimage, col);

    JScrollPane scroller = new JScrollPane(mypanel,
    //JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
    JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

    scroller.getVerticalScrollBar().setUnitIncrement( 16 );

    getContentPane().add(scroller);
    if (resizing == false) {
    int w;
    int h;

    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    if ((myimage.getWidth(this) +40) > d.width)
    w = d.width;
    else
    w = myimage.getWidth(this) + 40;
    if ((myimage.getHeight(this) +60) > (d.height -30))
    h = d.height -30;
    else
    h = myimage.getHeight(this) + 60;



    setSize(w,h);
    }
    setVisible(true);
    //mypanel.repaint();
    }

    public void setSize(){

    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    setSize(d.width, d.height);
    }

    public ResizeFrame(String title, Color c, boolean res) {


    super(title);
    resizing = res;
    col = c;
    if (resizing == true) {
    setSize();
    }



    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE );

    addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    dispose();
    }
    });


    }
    }
    //-------------------------

    //---------ResizePanel--------

    import java.awt.*;
    import javax.swing.*;
    import java.awt.image.*;


    public class ResizePanel extends JPanel{
    public Image myimage;
    public Color col;

    public ResizePanel(Image im, Color c) {
    myimage = im;
    col = c;
    repaint();
    }




    public Dimension getPreferredSize(){
    return (new Dimension(myimage.getWidth(this),
    myimage.getHeight(this)));
    }

    public void paint(Graphics g) {
    int h =0, v = 0;
    h = (this.getWidth()-myimage.getWidth(this))/2;
    v = (this.getHeight()-myimage.getHeight(this))/2;
    if (h< 0)
    h = 0;

    if (v<0) v = 0;
    g.setColor(col);
    g.fillRect(0,0,this.getWidth(),this.getHeight());
    g.drawImage(myimage, h,v, this);

    }

    }
    //--------------------------
    rfractal30, Apr 11, 2005
    #1
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Antonio Concepcion
    Replies:
    3
    Views:
    2,691
    Antonio Concepcion
    Feb 17, 2005
  2. vivienne wykes
    Replies:
    13
    Views:
    1,028
    vivienne wykes
    Aug 28, 2004
  3. rfractal30
    Replies:
    1
    Views:
    440
    rfractal30
    Apr 14, 2005
  4. rfractal30
    Replies:
    0
    Views:
    353
    rfractal30
    Apr 13, 2005
  5. Rohit Gupta
    Replies:
    2
    Views:
    451
    Rohit Gupta
    Jun 24, 2005
Loading...

Share This Page