Printing 如何打印预览JTable

Printing 如何打印预览JTable,printing,jtable,preview,Printing,Jtable,Preview,我是一名初级Java开发人员,我想构建一个类,该类接受JTable并在屏幕上预览如何在默认打印机上打印它。这就是我们所说的“打印预览”,就像MS Word、Excel等 正如我们已经知道的,Java不支持这种开箱即用的功能 根据我在谷歌上找到的一些例子,我构建了两个类。第一个TestPreview.java justs显示JTable,第二个PrintPreview.java预览如何在打印机上打印JTable 我有两个按钮来浏览页面,“上一页”和“下一页”以及“打印”按钮来打印JTable。 我

我是一名初级Java开发人员,我想构建一个类,该类接受JTable并在屏幕上预览如何在默认打印机上打印它。这就是我们所说的“打印预览”,就像MS Word、Excel等

正如我们已经知道的,Java不支持这种开箱即用的功能

根据我在谷歌上找到的一些例子,我构建了两个类。第一个TestPreview.java justs显示JTable,第二个PrintPreview.java预览如何在打印机上打印JTable

我有两个按钮来浏览页面,“上一页”和“下一页”以及“打印”按钮来打印JTable。 我的问题是,当我的JTable在多个页面中有太多行和跨距时,PrintPreview无法工作。它会一次又一次地显示同一页面。此外,它不会显示整个JTable数据,但只显示其中的一些数据,我不知道为什么

请帮忙

下面是我的两门课

TestPreview.java

PrintPreview.java

PackagePrintPreviewDemo;
导入javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
导入java.awt.image.buffereImage;
导入java.awt.print.*;
类PrintPreview扩展JFrame实现ActionListener、ItemListener{
JButton printButton=新JButton(“打印”);
Pageable Pageable=null;
双刻度=1.0;
第[]页=空;
JComboBox combobox=新的JComboBox();
CardLayout CardLayout=新的CardLayout();
JPanel previewPanel=新的JPanel(cardlayout);
JButton backButton=新JButton(“上一个”),forwardButton=新JButton(“下一个”);
公共打印预览(最终可打印打印,最终页面格式PageFormat){
超级(“打印预览”);
pageable=新的pageable(){
@凌驾
public int getNumberOfPages(){
Graphics Graphics=新的BuffereImage(1,1,BuffereImage.TYPE_INT_RGB).getGraphics();
int numPages=0;
试一试{
while(可打印的.print(图形、页面格式、numPages)==可打印的.PAGE_存在){
numPages++;
}
}捕获(例外情况除外){
}
返回数值;
}
@凌驾
公共页面格式getPageFormat(int x){
返回页面格式;
}
@凌驾
公共可打印getPrintable(int x){
返回可打印;
}
};
createPreview();
}
私有void createPreview(){
page=新页面[pageable.getNumberOfPages()];
PageFormat PageFormat=pageable.getPageFormat(0);
维度大小=新维度((int)pageFormat.getPaper().getWidth(),(int)pageFormat.getPaper().getHeight());
if(pageFormat.getOrientation()!=pageFormat.Grait){
尺寸=新尺寸(尺寸.高度,尺寸.宽度);
}
for(int i=0;i1);
临时添加(组合框);
温度添加(后退按钮);
温度添加(前进按钮);
温度添加(打印按钮);
顶部面板添加(温度);
printButton.addActionListener(此);
combobox.addItemListener(此);
getContentPane().add(topPanel,“北”);
}
@凌驾
公共无效itemStateChanged(ItemEvent ie){
显示(预览面板,(字符串)组合框.getSelectedItem());
backButton.setEnabled(combobox.getSelectedIndex()==0?false:true);
forwardButton.setEnabled(combobox.getSelectedIndex()==combobox.getItemCount()-1?false:true);
验证();
}
@凌驾
已执行的公共无效行动(行动事件ae){
对象o=ae.getSource();
如果(o==printButton){
试一试{
PrinterJob pj=PrinterJob.getPrinterJob();
pj.defaultPage(pageable.getPageFormat(0));
pj.可设置分页(可分页);
if(pj.printDialog()){
pj.print();
}
}捕获(例外情况除外){
showMessageDialog(null,例如toString(),“打印错误”,1);
}
}else if(o==backButton){
combobox.setSelectedIndex(combobox.getSelectedIndex()==0?0:combobox.getSelectedIndex()-1);
if(combobox.getSelectedIndex()==0){
backButton.setEnabled(错误);
}
}else if(o==转发按钮){
combobox.setSelectedIndex(combobox.getSelectedIndex()==combobox.getItemCount()-1?0:combobox.getSelectedIndex()+1);
if(combobox.getSelectedIndex()==combobox.getItemCount()-1){
forwardButton.setEnabled(错误);
}
}
}
类页扩展了JLabel{
最终整数n;
最终页面格式页面格式;
BuffereImage bufferimage=null;
维度大小=空;
公共页(int currentpage,维度大小){
这个。大小=大小;
bufferimage=新的BuffereImage(size.width、size.height、buffereImage.TYPE_INT_RGB);
n=当前页面;
pageformat=pageable.getPageFormat(n);
图形g=bufferimage.g
package printpreviewdemo;

import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.*;
import java.awt.print.*;
import java.text.MessageFormat;
import javax.print.attribute.*;
import javax.print.attribute.standard.MediaPrintableArea;
import javax.print.attribute.standard.OrientationRequested;
import javax.print.attribute.standard.Sides;
import javax.swing.JTable.PrintMode;

class TestPreview extends JFrame implements ActionListener {
    PrinterJob printerJob = PrinterJob.getPrinterJob();
    HashPrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
    JTable table = null;

    public TestPreview() {
        super("Test of Print Preview");
        getContentPane().add(createTable());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        setExtendedState(Frame.MAXIMIZED_BOTH);
        setVisible(true);
    }

    private JPanel createTable() {
       String val[][] = {
            {"A", "Test 01", "A", "Test 01"}, 
            {"B", "Test 02", "B", "Test 02"}, 
            {"C", "Test 03", "C", "Test 03"},
            {"D", "Test 04", "D", "Test 04"}, 
            {"E", "Test 05", "E", "Test 05"}, 
            {"F", "Test 06", "F", "Test 06"},
            {"G", "Test 01", "G", "Test 01"}, 
            {"H", "Test 02", "H", "Test 02"}, 
            {"I", "Test 03", "I", "Test 03"},
            {"J", "Test 03", "J", "Test 03"},
            {"K", "Test 04", "K", "Test 04"}, 
            {"L", "Test 05", "L", "Test 05"}, 
            {"M", "Test 06", "M", "Test 06"},
            {"N", "Test 01", "N", "Test 01"}, 
            {"O", "Test 02", "O", "Test 02"}, 
            {"P", "Test 03", "P", "Test 03"},
            {"Q", "Test 04", "Q", "Test 04"}, 
            {"R", "Test 05", "R", "Test 05"}, 
            {"S", "Test 06", "S", "Test 06"},
            {"T", "Test 01", "T", "Test 01"}, 
            {"U", "Test 02", "U", "Test 02"}, 
            {"V", "Test 03", "V", "Test 03"},
            {"W", "Test 04", "W", "Test 04"}, 
            {"X", "Test 05", "X", "Test 05"}, 
            {"Y", "Test 06", "Y", "Test 06"},
            {"Z", "Test 01", "Z", "Test 01"},
            {"1", "Test 02", "1", "Test 02"}, 
            {"2", "Test 03", "2", "Test 03"},
            {"3", "Test 04", "3", "Test 04"}, 
            {"4", "Test 05", "4", "Test 05"}, 
            {"5", "Test 06", "5", "Test 06"},
            {"6", "Test 01", "6", "Test 01"}, 
            {"7", "Test 02", "7", "Test 02"}, 
            {"8", "Test 03", "8", "Test 03"},
            {"9", "Test 04", "9", "Test 04"}, 
            {"10", "Test 05","10", "Test 05"},
            {"11", "Test 02","11", "Test 02"}, 
            {"12", "Test 03","12", "Test 03"},
            {"13", "Test 04","13", "Test 04"}, 
            {"14", "Test 05","14", "Test 05"}, 
            {"15", "Test 06","15", "Test 06"},
            {"16", "Test 01","16", "Test 01"}, 
            {"17", "Test 02","17", "Test 02"}, 
            {"18", "Test 03","18", "Test 03"},
            {"19", "Test 04","19", "Test 04"}, 
            {"20", "Test 05","20", "Test 05"},
            {"30", "Test 05","30", "Test 05"},
            {"31", "Test 02","31", "Test 02"}, 
            {"32", "Test 03","32", "Test 03"},
            {"33", "Test 04","33", "Test 04"}, 
            {"34", "Test 05","34", "Test 05"}, 
            {"35", "Test 06","35", "Test 06"},
            {"36", "Test 01","36", "Test 01"}, 
            {"37", "Test 02","37", "Test 02"}, 
            {"38", "Test 03","38", "Test 03"},
            {"39", "Test 04","39", "Test 04"}, 
            {"40", "Test 05","40", "Test 05"},
            {"40", "Test 05","40", "Test 05"},
            {"41", "Test 02","41", "Test 02"}, 
            {"42", "Test 03","42", "Test 03"},
            {"43", "Test 04","43", "Test 04"}, 
            {"44", "Test 05","44", "Test 05"}, 
            {"45", "Test 06","45", "Test 06"},
            {"46", "Test 01","46", "Test 01"}, 
            {"47", "Test 02","47", "Test 02"}, 
            {"48", "Test 03","48", "Test 03"},
            {"49", "Test 04","49", "Test 04"}, 
            {"50", "Test 05","50", "Test 05"},
            {"50", "Test 05","50", "Test 05"},
            {"51", "Test 02","51", "Test 02"}, 
            {"52", "Test 03","52", "Test 03"},
            {"53", "Test 04","53", "Test 04"}, 
            {"54", "Test 05","54", "Test 05"}, 
            {"55", "Test 06","55", "Test 06"},
            {"56", "Test 01","56", "Test 01"}, 
            {"57", "Test 02","57", "Test 02"}, 
            {"58", "Test 03","58", "Test 03"},
            {"59", "Test 04","59", "Test 04"}, 
            {"60", "Test 05","60", "Test 05"}
        };

        String headers[] = {"A", "B", "C", "D"};
        table = new JTable(val, headers);
        JButton previewButton = new JButton("Preview Table");
        previewButton.addActionListener(this);
        JPanel panel = new JPanel(new BorderLayout()), top = new JPanel(new FlowLayout());
        top.add(previewButton);
        panel.add(top, "North"); 
        panel.add(new JScrollPane(table), "Center");
        return panel;
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        if (ae.getActionCommand().equals("Preview Table"))
            attributes.add(new MediaPrintableArea(6, 6, 198, 278, MediaPrintableArea.MM)); // A4: 210x297mm
            attributes.add(Sides.DUPLEX);
            attributes.add(OrientationRequested.LANDSCAPE);
            new PrintPreview(
                table.getPrintable(PrintMode.FIT_WIDTH, null, new MessageFormat("Page {0}") ), 
                printerJob.getPageFormat(attributes)
            );
    }

    public static void main(String arg[]) {
        new TestPreview();
    }
}
package printpreviewdemo;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.awt.print.*;

class PrintPreview extends JFrame implements ActionListener, ItemListener {
    JButton printButton = new JButton("Print");
    Pageable pageable = null;
    double scale = 1.0;
    Page page[] = null;
    JComboBox combobox = new JComboBox();
    CardLayout cardlayout = new CardLayout();
    JPanel previewPanel = new JPanel(cardlayout);
    JButton backButton = new JButton("PREV"), forwardButton = new JButton("NEXT");

    public PrintPreview(final Printable printable, final PageFormat pageFormat) {
        super("Print Preview");        
        pageable = new Pageable() {
            @Override
            public int getNumberOfPages() {
                Graphics graphics = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB).getGraphics();                
                int numPages = 0;
                try {
                    while (printable.print(graphics, pageFormat, numPages) == Printable.PAGE_EXISTS) {
                        numPages++;
                    }
                } catch (Exception ex) {
                }
                return numPages;
            }

            @Override
            public PageFormat getPageFormat(int x) {
                return pageFormat;
            }

            @Override
            public Printable getPrintable(int x) {
                return printable;
            }
        };
        createPreview();
    }

    private void createPreview() {
        page = new Page[pageable.getNumberOfPages()];
        PageFormat pageFormat = pageable.getPageFormat(0);
        Dimension size = new Dimension((int) pageFormat.getPaper().getWidth(), (int) pageFormat.getPaper().getHeight());
        if (pageFormat.getOrientation() != PageFormat.PORTRAIT) {
            size = new Dimension(size.height, size.width);
        }
        for (int i = 0; i < page.length; i++) {
            combobox.addItem("" + (i + 1));
            page[i] = new Page(i, size);
            previewPanel.add("" + (i + 1), new JScrollPane(page[i]));
        }
        setTopPanel();
        getContentPane().add(previewPanel, "Center");
        pack();
        setExtendedState(Frame.MAXIMIZED_BOTH);
        setVisible(true);
    }

    private void setTopPanel() {
        FlowLayout fl = new FlowLayout();
        GridBagLayout gbl = new GridBagLayout();

        JPanel topPanel = new JPanel(gbl), temp = new JPanel(fl);
        backButton.addActionListener(this);
        forwardButton.addActionListener(this);
        backButton.setEnabled(false);
        forwardButton.setEnabled(page.length > 1);

        temp.add(combobox);
        temp.add(backButton);
        temp.add(forwardButton);
        temp.add(printButton);

        topPanel.add(temp);
        printButton.addActionListener(this);
        combobox.addItemListener(this);
        getContentPane().add(topPanel, "North");
    }

    @Override
    public void itemStateChanged(ItemEvent ie) {
        cardlayout.show(previewPanel, (String) combobox.getSelectedItem());
        backButton.setEnabled(combobox.getSelectedIndex() == 0 ? false : true);
        forwardButton.setEnabled(combobox.getSelectedIndex() == combobox.getItemCount() - 1 ? false : true);
        validate();
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        Object o = ae.getSource();
        if (o == printButton) {
            try {
                PrinterJob pj = PrinterJob.getPrinterJob();
                pj.defaultPage(pageable.getPageFormat(0));
                pj.setPageable(pageable);
                if (pj.printDialog()) {
                    pj.print();
                }
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null, ex.toString(), "Error in Printing", 1);
            }
        } else if (o == backButton) {
            combobox.setSelectedIndex(combobox.getSelectedIndex() == 0 ? 0 : combobox.getSelectedIndex() - 1);
            if (combobox.getSelectedIndex() == 0) {
                backButton.setEnabled(false);
            }
        } else if (o == forwardButton) {
            combobox.setSelectedIndex(combobox.getSelectedIndex() == combobox.getItemCount() - 1 ? 0 : combobox.getSelectedIndex() + 1);
            if (combobox.getSelectedIndex() == combobox.getItemCount() - 1) {
                forwardButton.setEnabled(false);
            }
        }
    }

    class Page extends JLabel {
        final int n;
        final PageFormat pageformat;
        BufferedImage bufferimage = null;
        Dimension size = null;

        public Page(int currentpage, Dimension size) {
            this.size = size;
            bufferimage = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_RGB);
            n = currentpage;
            pageformat = pageable.getPageFormat(n);
            Graphics g = bufferimage.getGraphics();
            g.setColor(Color.WHITE);                       
            g.fillRect(0, 0, (int) pageformat.getWidth(), (int) pageformat.getHeight());
            try {
                pageable.getPrintable(n).print(g, pageformat, n);
            } catch (Exception ex) {
            }
            setIcon(new ImageIcon(bufferimage));
        }
    }
}