Printing javax.swing.JInternalFrame?

Hi,

My javax.swing.JFrame contains a number of internal javax.swing.JInternalFrame's.

How do I print the contents (widget) of an JInternalFrame?
I do not want to add the code to each JInternalFrame.  
I would like to do it from the (parent) JFrame becasue I
have a reference to each JInternalFrame.

Thanks,

Alex.


PS.

I added this code to my JFrame, but it does not work (where javax.swing.JInternalFrame f is a reference to my internal frame);  I get a compile error:




PrintJob pjob = this.getToolkit().getPrintJob(f, "Printing Test", null);
// or    PrintJob pjob = f.getToolkit().getPrintJob(f, "Printing Test", null);

if (pjob != null) {
    Graphics pg = pjob.getGraphics();
    if (pg != null) {
    this.printAll(pg); // or f.printAll(pg);
    pg.dispose();
        }
        pjob.end();
        }


This is the compile error on this line:

PrintJob pjob = this.getToolkit().getPrintJob(f, "Printing Test", null);

Can't convert javax.swing.JInternalFrame to java.awt.Frame
akoifmanAsked:
Who is Participating?
 
AlexJ030200Commented:
A final comment.

There is a good discussion about performance of component printing in the java development connection. Maybe there are other ideas there.

http://developer.java.sun.com/developer/qow/archive/20/index.html 
0
 
akoifmanAuthor Commented:
Adjusted points to 200
0
 
AlexJ030200Commented:
One solution to your problem is to implement interface Printable by your JInternalFrames. If you do that, then you can add a method say printInternal to print their contents. The code for the printInternal method could be:

  public void printInternal(javax.swing.JInternalFrame internal) {
    try {
      PrinterJob pjob = PrinterJob.getPrinterJob();
      pjob.setPrintable((Printable)internal);
      if (pjob.printDialog())
        pjob.print();
      } catch (Exception e) {
        e.printStackTrace();
      }
  }

The implementation of the print method of the Printable interface can be done with the help of the paint(java.awt.Graphics) method of Internal frames.

Hope this helps.
0
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
akoifmanAuthor Commented:
Hi,

Does that mean if I have a number of different JInternalFrames, I have to add this to all of them?

I am using Java 2, JDK 1.2.2.

Thanks,

Alex.
0
 
AlexJ030200Commented:
You can define a PrintableJInternalFrame which extends JInternalFrame and implements Printable. Then you inherit from this class instead.

If you are talking about the print method, it depends; if you only need a generic print for any internal frame, this approach will work. If you need specialized print functions, then you could rewrite the print method when necessary and use the default one elsewhere.

Here is a possible implementation of the generic print method of the Printable interface:

  public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
    if (pageIndex > 0) {
      return(NO_SUCH_PAGE);
    } else {
      Graphics2D g2d = (Graphics2D)g;
      g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
      disableDoubleBuffering(this);
      paint(g2d);
      enableDoubleBuffering(componentToBePrinted);
      return(PAGE_EXISTS);
    }
  }


AlexJ
0
 
AlexJ030200Commented:
Forgot to mention that the code above was also published by diakov as part of an answer in another question.

AlexJ
0
 
akoifmanAuthor Commented:
Hi,

Thanks a lot.  We are making progress.  It took about 15 min. to print a tab panel.  Possible reason that I had to comment out xxxDoubleBuffering, because I could not compile your code.  I am getting No Method errors.  Why?  

What is componentToBePrinted?
  JComponent c = (JComponent) myFrame.getContentPane();


  224.       disableDoubleBuffering(this);
             <-------------------------->
** Error: No method named "disableDoubleBuffering" was found in


  226.       enableDoubleBuffering(componentToBePrinted);
                                   <------------------>
0
 
akoifmanAuthor Commented:
Hi,

Thanks a lot.  We are making progress.  It took about 15 min. to print a tab panel.  Possible reason that I had to comment out xxxDoubleBuffering, because I could not compile your code.  I am getting No Method errors.  Why?  

What is componentToBePrinted?
  JComponent c = (JComponent) myFrame.getContentPane();


  224.       disableDoubleBuffering(this);
             <-------------------------->
** Error: No method named "disableDoubleBuffering" was found in


  226.       enableDoubleBuffering(componentToBePrinted);
                                   <------------------>
0
 
AlexJ030200Commented:
Sorry, this was taken from another program. Please replace the two lines about double buffering by

setDoubleBuffer(false);

and

setDoubleBuffer(true);

respectively.
0
 
AlexJ030200Commented:
If your performance problem persist after disabling the double buffering, you will probably have to write your own print method for this frame.
0
 
akoifmanAuthor Commented:
Hi,

Thanks a lot.  We are making progress.  It took about 15 min. to print a tab panel.  Possible reason that I had to comment out xxxDoubleBuffering, because I could not compile your code.  I am getting No Method errors.  Why?  

What is componentToBePrinted?
  JComponent c = (JComponent) myFrame.getContentPane();


  224.       disableDoubleBuffering(this);
             <-------------------------->
** Error: No method named "disableDoubleBuffering" was found in


  226.       enableDoubleBuffering(componentToBePrinted);
                                   <------------------>
0
 
AlexJ030200Commented:
Hi,

this is the third time we see your previous comment, it seems that reloading the page (or something like that) is making your message to be reinserted.

Please push the Reload Question button near the top right of the page so that this strange page behavior stops.
0
 
akoifmanAuthor Commented:
Hi,

No speed improvement.  

"setDoubleBuffer" is not found, so I used "setDoubleBuffered".  Should I run in a separate thread?  ANy other recomendations?  Thanks.  

I did this:

      setDoubleBuffered(false);
      paint(g2d);
      setDoubleBuffered(true);

Thanks a lot,

Alex.
0
 
AlexJ030200Commented:
If using the paint(Graphics) method to print the frame is unacceptable in time you will have to write your own print method by iterating over rows and columns and printing the text of each cell.
The java.awt.Graphics and java.awt.Graphics2D have all what you need in order to achieve your goal.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.