简体   繁体   English

使用setVisible打印JFrame(false)

[英]Print JFrame with setVisible(false)

I create a Swing application with 2 JFrame windows and I want to 1st frame as main page. 我创建了一个带有2个JFrame窗口的Swing应用程序,我想将第1帧作为主页面。 I set print button in 1st frame to print 2nd frame. 我在第1帧设置打印按钮以打印第2帧。

How can I print the second frame with frame.setVisible(false); 如何用frame.setVisible(false);打印第二帧frame.setVisible(false); ? How can I solve it? 我该如何解决?

I put my code below: 我把我的代码放在下面:

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);
    }
}

How I hate printing components, seriously, either learn to do it by hand or use something like Jasper Reports. 我非常讨厌打印组件,要么学会手工制作,要么使用像Jasper Reports这样的东西。

You have a series of issues... 你有一系列问题......

  1. Components can only have one parent, so when you create your second window and add the components to it, you're removing them from the first window; 组件只能有一个父组件,因此当您创建第二个窗口并向其添加组件时,您将从第一个窗口中删除它们;
  2. You can't paint an invisible component; 你不能画一个看不见的组件;
  3. You really shouldn't be printing the frame anyway, better to print the panel instead; 你真的不应该打印框架,而是更好地打印面板;
  4. Unless it's been realised on the screen, you'll be responsible for ensure that the component is properly laid out before it's printed 除非在屏幕上实现,否则您将负责确保组件在打印前正确布局

You really don't want to print the frame, you actually want to print the panel instead, it's just a lot simpler and you don't get the frame. 你真的不想打印框架,你实际上想要打印面板,它只是更简单,你没有得到框架。 If you want to print the frame as well, you will need to make the frame visible. 如果您还想打印框架,则需要使框架可见。

So, based on this previous answer 所以,基于此前的答案

窗户 表格

So, basically, this adds a simple factory method to create the base panel. 因此,基本上,这会添加一个简单的工厂方法来创建基本面板。 This will make two instances of this panel, one to print and one to display (technically you could use one, but you get the idea). 这将产生这个面板的两个实例,一个用于打印,一个用于显示(技术上你可以使用一个,但你明白了)。

The printing process will update the layout of the panel while it's printing to make sure that it's contents are properly laid, so that they are actually rendered. 打印过程将在打印时更新面板的布局,以确保其内容正确放置,以便实际呈现它们。

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());
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM