Solved

Printing javax.swing.JInternalFrame?

Posted on 2000-03-07
14
663 Views
Last Modified: 2008-02-20
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
Comment
Question by:akoifman
  • 8
  • 6
14 Comments
 

Author Comment

by:akoifman
ID: 2595595
Adjusted points to 200
0
 
LVL 2

Expert Comment

by:AlexJ030200
ID: 2596998
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
 

Author Comment

by:akoifman
ID: 2597102
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
 
LVL 2

Expert Comment

by:AlexJ030200
ID: 2597149
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
 
LVL 2

Expert Comment

by:AlexJ030200
ID: 2597197
Forgot to mention that the code above was also published by diakov as part of an answer in another question.

AlexJ
0
 

Author Comment

by:akoifman
ID: 2597519
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
 

Author Comment

by:akoifman
ID: 2597549
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
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 2

Expert Comment

by:AlexJ030200
ID: 2597560
Sorry, this was taken from another program. Please replace the two lines about double buffering by

setDoubleBuffer(false);

and

setDoubleBuffer(true);

respectively.
0
 
LVL 2

Expert Comment

by:AlexJ030200
ID: 2597599
If your performance problem persist after disabling the double buffering, you will probably have to write your own print method for this frame.
0
 

Author Comment

by:akoifman
ID: 2597753
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
 
LVL 2

Expert Comment

by:AlexJ030200
ID: 2597827
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
 

Author Comment

by:akoifman
ID: 2597981
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
 
LVL 2

Expert Comment

by:AlexJ030200
ID: 2598026
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
 
LVL 2

Accepted Solution

by:
AlexJ030200 earned 200 total points
ID: 2601365
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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction Java can be integrated with native programs using an interface called JNI(Java Native Interface). Native programs are programs which can directly run on the processor. JNI is simply a naming and calling convention so that the JVM (Java…
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
Viewers learn about the third conditional statement “else if” and use it in an example program. Then additional information about conditional statements is provided, covering the topic thoroughly. Viewers learn about the third conditional statement …
The viewer will learn how to implement Singleton Design Pattern in Java.

932 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now