2017-10-27 6 views
1

私は2 JFrameウィンドウでスイングアプリケーションを作成し、メインページとして1番目のフレームにします。最初のフレームに印刷ボタンを設定して2番目のフレームを印刷します。setVisible(false)でJFrameを印刷

frame.setVisible(false);で2番目のフレームを印刷するにはどうすればよいですか?どうすれば解決できますか?

私は以下の私のコードを配置:

package printuiwindow; 

    /** 
    * 
    * @author Saravanan Ponnusamy 
    */ 
    import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*; 
    import java.awt.print.*; 

    class PrintUIWindow implements Printable, ActionListener { 


    JFrame frameToPrint; 

    public int print(Graphics g, PageFormat pf, int page) throws 
                 PrinterException { 

     if (page > 0) { 
      return NO_SUCH_PAGE; 
     } 

     Graphics2D g2d = (Graphics2D)g; 
     g2d.translate(pf.getImageableX(), pf.getImageableY()-55); 

     frameToPrint.print(g); 

     return PAGE_EXISTS; 
    } 

    public void actionPerformed(ActionEvent e) { 
     PrinterJob job = PrinterJob.getPrinterJob(); 
     job.setPrintable(this); 
     boolean ok = job.printDialog(); 
     if (ok) { 
      try { 
        job.print(); 
      } catch (PrinterException ex) { 
System.out.println(ex); 
      } 
     } 
    } 

    public PrintUIWindow(JFrame f) { 
     frameToPrint = f; 
    } 

    public static void main(String args[]) { 
     UIManager.put("swing.boldMetal", Boolean.FALSE); 
     JFrame f = new JFrame("Print UI Example"); 
     f.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) {System.exit(0);} 
     }); 
//Printing frame design start 


     JFrame frame = new JFrame("Print UI Example"); 
     JLabel label11=new JLabel("Selling Bill",JLabel.CENTER); 
     JLabel label21=new JLabel("Customer Name :",JLabel.LEFT); 
     JLabel label31=new JLabel("Buying Date :",JLabel.LEFT); 
     JLabel label41=new JLabel("Book Buyed :",JLabel.LEFT); 
     JLabel label51=new JLabel("Number :",JLabel.LEFT); 
     JLabel label61=new JLabel("Total Price :",JLabel.LEFT); 
     label11.setFont(new Font("Courier New", Font.BOLD, 13)); 
     label21.setFont(new Font("Courier New", Font.BOLD, 13)); 
     label31.setFont(new Font("Courier New", Font.BOLD, 13)); 
     label41.setFont(new Font("Courier New", Font.BOLD, 13)); 
     label51.setFont(new Font("Courier New", Font.BOLD, 13)); 
     label61.setFont(new Font("Courier New", Font.BOLD, 13)); 
JPanel panel1=new JPanel(); 
panel1.setLayout(new GridLayout(6,1)); 
     panel1.add(label11); 
     panel1.add(label21); 
     panel1.add(label31); 
     panel1.add(label41); 
     panel1.add(label51); 
     panel1.add(label61); 
     frame.setSize(300,300); 
     frame.setLocationRelativeTo(null); 
     frame.add(panel1,BorderLayout.CENTER); 
     panel1.setBackground(Color.WHITE); 
     frame.setResizable(false); 
     frame.setVisible(true); 
    //printing frame design end  

//first frame design start 
     JLabel label1=new JLabel("Selling Bill",JLabel.CENTER); 
     JLabel label2=new JLabel("Customer Name :",JLabel.LEFT); 
     JLabel label3=new JLabel("Buying Date :",JLabel.LEFT); 
     JLabel label4=new JLabel("Book Buyed :",JLabel.LEFT); 
     JLabel label5=new JLabel("Number :",JLabel.LEFT); 
     JLabel label6=new JLabel("Total Price :",JLabel.LEFT); 

     label1.setFont(new Font("Courier New", Font.BOLD, 13)); 
     label2.setFont(new Font("Courier New", Font.BOLD, 13)); 
     label3.setFont(new Font("Courier New", Font.BOLD, 13)); 
     label4.setFont(new Font("Courier New", Font.BOLD, 13)); 
     label5.setFont(new Font("Courier New", Font.BOLD, 13)); 
     label6.setFont(new Font("Courier New", Font.BOLD, 13)); 

     JButton printButton = new JButton("Print This Window"); 

     //print button code 
     printButton.addActionListener(new PrintUIWindow(frame)); 
     JPanel panel=new JPanel(); 

     panel.setLayout(new GridLayout(6,1)); 
     panel.add(label1); 
     panel.add(label2); 
     panel.add(label3); 
     panel.add(label4); 
     panel.add(label5); 
     panel.add(label6); 
     f.setSize(300,300); 
     f.setLocationRelativeTo(null); 
     f.add(panel,BorderLayout.CENTER); 
     f.add(printButton,BorderLayout.SOUTH); 
     panel.setBackground(Color.WHITE); 
     f.setResizable(false); 
     f.setVisible(true); 
    } 
} 
+0

を参照してください[複数JFramesの使用、グッド/悪い習慣?](http://stackoverflow.com/q/9554636/418556) –

+0

だから、あなたが利用可能なコードに基づいて、あなたは2つのフレームを持っていますどちらも目に見えます...これは故意ですか? – MadProgrammer

+0

あなたのコードはあなたの質問にあなたが何を記述しているか明らかにしていません。ただし、ボタンをクリックしてフレームを表示する場合は、ボタンハンドラで2ndframe.setvisibile(true)を使用します。 –

答えて

3

を私はどちらか、真剣に、印刷コンポーネントを憎むどのように手でそれを行うか、ジャスパーレポートのようなものを使用することを学びます。あなたは一連の問題を持っている

...

  1. コンポーネントのみ、あなたの第二のウィンドウを作成し、それにコンポーネントを追加するときに、あなたが最初のウィンドウから削除している、片方の親を持つことができます。
  2. 不可視コンポーネントをペイントすることはできません。
  3. とにかくフレームを印刷しないでください。代わりにパネルを印刷してください。
  4. それが画面上で実現されていない限り、あなたはそれが

を印刷した前に、コンポーネントが適切にレイアウトされていることを確認あなたは本当に枠を印刷しないために責任があるでしょう、あなたは実際に印刷したいです代わりにパネルを使用すると、はるかに簡単で、フレームを取得できません。フレームを印刷する場合は、フレームを表示する必要があります。

ので、this previous answer

The windowThe form

に基づいだから、基本的に、これはベースパネルを作成するための簡単なファクトリメソッドを追加します。これは、このパネルの2つのインスタンスを作成し、1つは印刷し、もう1つは表示します(技術的には1つを使用できますが、そのアイデアが得られます)。

印刷プロセスは、印刷中にパネルのレイアウトを更新して、実際にレンダリングされるように内容が正しく配置されていることを確認します。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.print.PageFormat; 
import java.awt.print.Printable; 
import static java.awt.print.Printable.NO_SUCH_PAGE; 
import static java.awt.print.Printable.PAGE_EXISTS; 
import java.awt.print.PrinterException; 
import java.awt.print.PrinterJob; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 

class PrintUIWindow implements Printable, ActionListener { 

    JPanel frameToPrint; 
    boolean fill = false; 

    public int print(Graphics g, PageFormat pf, int page) throws 
        PrinterException { 

     if (page > 0) { 
      return NO_SUCH_PAGE; 
     } 
     double width = (int) Math.floor(pf.getImageableWidth()); 
     double height = (int) Math.floor(pf.getImageableHeight()); 

     if (!fill) { 

      width = Math.min(width, frameToPrint.getPreferredSize().width); 
      height = Math.min(height, frameToPrint.getPreferredSize().height); 

     } 

     System.out.println(width + "x" + height); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.translate(pf.getImageableX(), pf.getImageableY()); 
     System.out.println(width + "x" + height); 
     frameToPrint.setBounds(0, 0, (int) Math.floor(width), (int) Math.floor(height)); 
     if (frameToPrint.getParent() == null) { 
      frameToPrint.addNotify(); 
     } 
     frameToPrint.validate(); 
     frameToPrint.doLayout(); 
     frameToPrint.printAll(g2d); 
     if (frameToPrint.getParent() != null) { 
      frameToPrint.removeNotify(); 
     } 

     return PAGE_EXISTS; 
    } 

    public void actionPerformed(ActionEvent e) { 
     PrinterJob job = PrinterJob.getPrinterJob(); 
     job.setPrintable(this); 
     boolean ok = job.printDialog(); 
     if (ok) { 
      try { 
       job.print(); 
      } catch (PrinterException ex) { 
       System.out.println(ex); 
      } 
     } 
    } 

    public PrintUIWindow(JPanel f) { 
     frameToPrint = f; 
    } 

    public static void forceLayout(JPanel panel) { 
     if (panel.getParent() == null) { 
      panel.addNotify(); 
     } 
     panel.validate(); 
     panel.doLayout(); 
     if (panel.getParent() != null) { 
      panel.removeNotify(); 
     } 
    } 

    public static JPanel makePanel() { 
     JLabel label11 = new JLabel("Selling Bill", JLabel.LEFT); 
     JLabel label21 = new JLabel("Customer Name :", JLabel.LEFT); 
     JLabel label31 = new JLabel("Buying Date :", JLabel.LEFT); 
     JLabel label41 = new JLabel("Book Buyed :", JLabel.LEFT); 
     JLabel label51 = new JLabel("Number :", JLabel.LEFT); 
     JLabel label61 = new JLabel("Total Price :", JLabel.LEFT); 
     label11.setFont(new Font("Courier New", Font.BOLD, 13)); 
     label21.setFont(new Font("Courier New", Font.BOLD, 13)); 
     label31.setFont(new Font("Courier New", Font.BOLD, 13)); 
     label41.setFont(new Font("Courier New", Font.BOLD, 13)); 
     label51.setFont(new Font("Courier New", Font.BOLD, 13)); 
     label61.setFont(new Font("Courier New", Font.BOLD, 13)); 
     JPanel panel1 = new JPanel(); 
     panel1.setLayout(new GridLayout(6, 1)); 
     panel1.add(label11); 
     panel1.add(label21); 
     panel1.add(label31); 
     panel1.add(label41); 
     panel1.add(label51); 
     panel1.add(label61); 
     panel1.setBackground(Color.WHITE); 
     return panel1; 
    } 

    public static void main(String args[]) { 
     UIManager.put("swing.boldMetal", Boolean.FALSE); 
     JFrame f = new JFrame("Print UI Example"); 

     JButton printButton = new JButton("Print This Window"); 

     JPanel toPrint = makePanel(); 
     System.out.println(toPrint.getPreferredSize()); 
     forceLayout(toPrint); 
     System.out.println(toPrint.getPreferredSize()); 

     printButton.addActionListener(new PrintUIWindow(toPrint)); 
     JPanel panel = makePanel(); 
     f.add(panel, BorderLayout.CENTER); 
     f.add(printButton, BorderLayout.SOUTH); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 

     System.out.println(panel.getPreferredSize()); 
     System.out.println(panel.getSize()); 
    } 
} 
+0

お友達にありがとう私はそれを今私は目に見えないコンポーネントを塗ることができない理解している。私はそのJpanelを印刷し、最初のパネルにパネルを追加する必要がありますThankyou very much guys –

+0

問題解決の手助けがあれば[回答を受け入れてください](http://meta.stackexchange.com/a/5235/155831)してください。 –

関連する問題