【发布时间】:2017-10-27 06:59:38
【问题描述】:
我创建了一个带有 2 个 JFrame 窗口的 Swing 应用程序,我想将第一帧作为主页。我将第一帧中的打印按钮设置为打印第二帧。
如何使用frame.setVisible(false); 打印第二帧?我该如何解决?
我把我的代码放在下面:
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);
}
}
【问题讨论】:
-
所以,根据你可用的代码,你有两个框架,两个都是可见的……这是故意的吗?
-
您的代码没有显示您在问题中描述的内容。但是,如果您想通过单击按钮来显示框架,请在按钮处理程序中使用 2ndframe.setvisibile(true)。
-
因此,您遇到了一系列复合问题。 1-组件只能有一个父级,因此当您创建第二个窗口并将组件添加到其中时,您将从第一个窗口中删除它们; 2-您不能绘制不可见的组件; 3-你真的不应该打印框架,最好打印面板; 4- 除非它已在屏幕上实现,否则您将负责确保组件在打印之前正确布局
-
作为一般建议,不要以这种方式打印,打印很复杂,与在屏幕上处理图形完全不同
标签: java swing printing jframe