Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 757
  • Last Modified:

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
0
akoifman
Asked:
akoifman
  • 8
  • 6
1 Solution
 
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
 
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
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
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
 
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

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 8
  • 6
Tackle projects and never again get stuck behind a technical roadblock.
Join Now