Igr
Igr

Reputation: 1045

JFrame not staying displayed - java

I have a program that does several thing and displays different JFrames after several actions. When I launch the first JFrame from the main, it all goes ok, but When I launch it from another class different from the main class, it doesn't shows up.

What is the point? What am I doing wrong?

Here's some code:

This is called from the main:

SwingUtilities.invokeLater(new Runnable() {
                PdfFileUtils pfu = new PdfFileUtils(path);

                public void run() {
                    try {
                        PdfToImg.setup(pfu, null);
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            });

And it works.

And this is called from another class that is used after some operations:

pfu.setPath(SIGNED);

    SwingUtilities.invokeLater(new Runnable() {

        public void run() {
            try {
                PdfToImg.setup(pfu, data);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    });

Sometimes (every 4 or 5 executions), it launches interrupted exception.

I also tried launching the second frame in this way:

 pfu.setPath(SIGNED);

 try {
    PdfToImg.setup(pfu, data);
 } catch (IOException ex) {
    ex.printStackTrace();
 }

But it shows up for a second and than disappears.

EDIT :

This is the setup() method:

public static void setup(PdfFileUtils pfu, BiometricData data) throws IOException {

    // load a pdf from a byte buffer
    File file = new File(pfu.getPath());
    RandomAccessFile raf = new RandomAccessFile(file, "r");
    FileChannel channel = raf.getChannel();
    ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0,
            channel.size());
    PDFFile pdffile = new PDFFile(buf);

    int numPgs = pdffile.getNumPages();
    ImageIcon[] images = new ImageIcon[numPgs];

    for (int i = 0; i < numPgs; i++) {
        // draw the first page to an image
        PDFPage page = pdffile.getPage(i + 1);
        // get the width and height for the doc at the default zoom
        Rectangle rect = new Rectangle(0, 0, (int) page.getBBox()
                .getWidth(), (int) page.getBBox().getHeight());
        // generate the image
        Image img = page.getImage(rect.width, rect.height, rect, null,
                true, true);
        pfu.setWidth(rect.width);
        pfu.setHeight(rect.height);
        // save it on an array
        images[i] = new ImageIcon(img);
    }

    if(data != null){
        SignedFileDisplay fileDisplay = new SignedFileDisplay(pfu, data);
        fileDisplay.DisplayAndSelect(images);
    } else{
        SignPosition signPos = new SignPosition(pfu);
        signPos.DisplayAndSelect(images);
    }
    raf.close();
}

The JFrames are launched by SignedFileDisplay(pfu, data) and by SignPosition(pfu). They work both if launched by the main, and no one the second time.

The constructors are:

public SignPosition(PdfFileUtils pfutils) {

    pfu = pfutils;

    // scale dimensions
    width = (int) (scale * pfu.getWidth());
    height = (int) (scale * pfu.getHeight());

    // sets the frame appearance
    sp.setSize(width + 8, height + 68);
    sp.setVisible(true);
    sp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    sp.setLocationRelativeTo(null);

    // Add the image gallery panel
    add(imageGallery, BorderLayout.PAGE_START);

    // creates the JButtons objects for each button
    JButton FIRST = new JButton("|<<<");
    JButton PREVIOUS = new JButton("< Prev");
    JButton OK = new JButton("Ok");
    JButton NEXT = new JButton("Next >");
    JButton LAST = new JButton(">>>|");

    // adds the buttons to the button panel
    JPanel buttons = new JPanel();
    buttons.setLayout(new GridLayout(1, 4));
    buttons.add(FIRST);
    buttons.add(PREVIOUS);
    buttons.add(OK);
    buttons.add(NEXT);
    buttons.add(LAST);

    // add buttons on the bottom of the frame
    add(buttons, BorderLayout.SOUTH);

    // register listener
    FirstButtonListener FirstButton = new FirstButtonListener();
    PreviousButtonListener PreviousButton = new PreviousButtonListener();
    OkButtonListener OkButton = new OkButtonListener();
    NextButtonListener NextButton = new NextButtonListener();
    LastButtonListener LastButton = new LastButtonListener();

    // add listeners to corresponding componenets
    FIRST.addActionListener(FirstButton);
    PREVIOUS.addActionListener(PreviousButton);
    OK.addActionListener(OkButton);
    NEXT.addActionListener(NextButton);
    LAST.addActionListener(LastButton);
}

and

public SignedFileDisplay(PdfFileUtils pfutils, BiometricData bd) {

    data = bd;
    pfu = pfutils;

    // scale dimensions
    width = (int) (scale * pfu.getWidth());
    height = (int) (scale * pfu.getHeight());

    // sets the frame appearance
    sfd.setSize(width + 8, height + 68);
    sfd.setVisible(true);
    sfd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    sfd.setLocationRelativeTo(null);

    // Add the image gallery panel
    add(imageGallery, BorderLayout.PAGE_START);

    // creates the JButtons objects for each button
    JButton FIRST = new JButton("|<<<");
    JButton PREVIOUS = new JButton("< Prev");
    JButton GRAPH = new JButton("Gaph display");
    JButton NEXT = new JButton("Next >");
    JButton LAST = new JButton(">>>|");

    // adds the buttons to the button panel
    JPanel buttons = new JPanel();
    buttons.setLayout(new GridLayout(1, 4));
    buttons.add(FIRST);
    buttons.add(PREVIOUS);
    buttons.add(GRAPH);
    buttons.add(NEXT);
    buttons.add(LAST);

    // add buttons on the bottom of the frame
    add(buttons, BorderLayout.SOUTH);

    // register listener
    FirstButtonListener FirstButton = new FirstButtonListener();
    PreviousButtonListener PreviousButton = new PreviousButtonListener();
    GraphButtonListener GraphButton = new GraphButtonListener();
    NextButtonListener NextButton = new NextButtonListener();
    LastButtonListener LastButton = new LastButtonListener();

    // add listeners to corresponding componenets
    FIRST.addActionListener(FirstButton);
    PREVIOUS.addActionListener(PreviousButton);
    GRAPH.addActionListener(GraphButton);
    NEXT.addActionListener(NextButton);
    LAST.addActionListener(LastButton);
}

Obviously the both extends JFRAME

Upvotes: 0

Views: 115

Answers (2)

Gabriel C&#226;mara
Gabriel C&#226;mara

Reputation: 1249

Have many frames is not a good practice. You should try to use the JDialog instead of JFrame.

This way you can pass the Main Frame to the others dialogs and let them be modal

Like this:

Opening from main

public class Test extends JDialog {
    public Test(Frame frame, String dialogName) {
        super(frame, dialogName, true);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setBounds(x, y, w, h);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        new Test(null, "Test Dialog");
    }
}

Opening from another frame

public void yourMethod() {
   new Test(yourMainFrame, dialogName);
}

Upvotes: 0

Cornelia
Cornelia

Reputation: 628

Are you typing something into that frame? Do you have any shortcuts defined per application? I had the same problem with my application frame dissapearing from time to time. In my case, i had some key shortcuts defined per application and one of them was Shift + C (closing the application - bad choice, i know).. so whenever i wanted to type upper case for "c" into a field, i was actually calling the shortcut to close window.

Upvotes: 1

Related Questions