用Java在同一页上打印2个JTable

用Java在同一页上打印2个JTable,java,jtable,Java,Jtable,我有2个JTables,我想把它们打印在同一页上。我现在Java知识的高度只让我能够在两个单独的页面上打印它们。下面是我正在进行的工作的摘录。我想在同一页上打印userTable和compTable。谢谢你的帮助 public void printTable(int type) { if(type == 0) { } else { userTable.getTableHeader()

我有2个JTables,我想把它们打印在同一页上。我现在Java知识的高度只让我能够在两个单独的页面上打印它们。下面是我正在进行的工作的摘录。我想在同一页上打印userTable和compTable。谢谢你的帮助

public void printTable(int type)
    {
        if(type == 0)
        {

        }
        else
        {
            userTable.getTableHeader().setFont(mainFont);
            userTable.setFont(mainFont);


            compTable.getTableHeader().setFont(mainFont);
            compTable.setFont(mainFont);

            MessageFormat header = new MessageFormat("Certificate Values");
            MessageFormat footer = new MessageFormat("Page{0,number,integer}");

            MessageFormat header1 = new MessageFormat("Interpolated Values");
            MessageFormat footer1 = new MessageFormat("Page{0,number,integer}");

            try
            {   
                userTable.print( JTable.PrintMode.FIT_WIDTH, header, footer);
                compTable.print( JTable.PrintMode.FIT_WIDTH, header1, footer1);
            }
            catch (PrinterException ex)
            {
                // TODO Auto-generated catch block
                ex.printStackTrace();
            }
        }
    }

下面是我尝试过的代码。该程序提取表格数据、HTML表格格式和HTML内容结果。生成的HTML作为编辑器内容显示在
编辑器窗格中。
JEditorPane
print()
方法允许将页面内的内容打印为两个表

注意事项:

  • 如果表大小(行)不变,这是可以的。另外,请注意,生成的HTML非常基本,并且有更完善的解决方案(可以通过谷歌搜索找到)
  • JEditorPane
    仅支持HTML 3.2。这意味着有限的CSS和 样式功能。如果需要更多样式,可以在JavaFX的
    WebView
    中显示生成的HTML内容并打印出来
  • 另一个选项是在web浏览器中显示生成的HTML并打印
  • 已经建议使用ApachePOI
  • HtmlTablePrinter.java

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.table.*;
    import java.text.MessageFormat;
    
    public class HtmlTablePrinter {
    
        public static void main(String [] args) {
            new HtmlTablePrinter().displayTable();
        }
    
        private void displayTable() {
            final JTable table1 = getTable1();
            final JTable table2 = getTable2();
            JButton previewButton = new JButton("Print preview");
            previewButton.addActionListener(actionEvent -> {
                try {
                    printPreview(getHtml(table1, table2));
                }
                catch (Exception ex) {
                    ex.printStackTrace();
                }
            });
            JPanel panel = new JPanel();
            panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
            panel.add(new JScrollPane(table1));
            panel.add(new JScrollPane(table2));
            JFrame frame = new JFrame("Tables Print Demo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(panel, BorderLayout.CENTER);
            frame.add(previewButton, BorderLayout.SOUTH);
            frame.setLocation(200, 100);
            frame.setSize(500, 500);
            frame.setVisible(true);
        }
    
        private JTable getTable1() {
            String data [][] = {{"Violet", "Indigo"},
                    {"Blue", "Green"},
                    {"Yellow", "Orange"},
                    {"Red", "Others"}};
            String header [] = {"Colors 1", "Colors 2"};
            return new JTable(data, header);
        }
    
        private JTable getTable2() {
            TableModel model = new AbstractTableModel() {
                @Override public int getColumnCount() {
                    return 2;
                }
                @Override public int getRowCount() {
                    return 10;
                }
                @Override public Object getValueAt(int row, int col) {
                    return ("Cell at row " + (row+1) + " col " + (col+1));
                }
            };
            return new JTable(model);
        }
    
        private String getHtml(JTable table1, JTable table2) {
            String style = "<style>table, th, td {border:1px solid #C0C0C0;" +
                    "font-family:sans-serif;padding:2px;}</style>";
            StringBuilder line = new StringBuilder();
            line.append("<html>")
                .append("<head>").append(style).append("</head>")
                .append("<body>");
            line = getTableHtml(table1, line);
            line = getTableHtml(table2, line);
            line.append("</body>").append("</html>");
            return line.toString();
        }
    
        private StringBuilder getTableHtml(JTable table, StringBuilder line) {
            TableModel model = table.getModel();
            line.append("<table>");
            line.append("<tr>");
            for (int j = 0; j < model.getColumnCount(); j++) {
                line.append("<th scope='col'>");
                line.append(model.getColumnName(j));
                line.append("</th>");
            }
            line.append("</tr>");
            for (int i = 0; i < model.getRowCount(); i++) {
                line.append("<tr>");
                for (int j = 0; j < model.getColumnCount(); j++) {
                    line.append("<td>");
                    line.append(model.getValueAt(i, j));
                    line.append("</td>");
                }
                line.append("</tr>");
            }
            line.append("</table>").append("<br/>");
            return line;
        }
    
        public void printPreview(String html) {
            JDialog dialog = new JDialog();
            dialog.setTitle("Tables Print Preview");
            dialog.setModal(true);
            JEditorPane editorPane = new JEditorPane("text/html", html);
            editorPane.setMargin(new Insets(10, 10, 10, 10));
            editorPane.setEditable(false);
            JButton printButton = new JButton("Print...");
            printButton.addActionListener(actionEvent -> {
                MessageFormat hd = new MessageFormat("Colors & stuff");
                MessageFormat ft = new MessageFormat("Page {0,number,integer}");
                try {
                    editorPane.print(hd, ft);
                } catch(Exception ex) { 
                    ex.printStackTrace();
                }
            });
            dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            JPanel panel = new JPanel();
            panel.add(new JScrollPane(editorPane));
            panel.add(new JSeparator(SwingConstants.VERTICAL));
            panel.add(printButton);
            dialog.add(panel);
            dialog.setSize(500, 700);
            dialog.setLocation(300, 50);
            dialog.setVisible(true);
        }
    }
    
    import java.awt.*;
    导入java.awt.event.*;
    导入javax.swing.*;
    导入javax.swing.table.*;
    导入java.text.MessageFormat;
    公共类HtmlTablePrinter{
    公共静态void main(字符串[]args){
    新的HtmlTablePrinter().displayTable();
    }
    私有void displayTable(){
    最终JTable table1=getTable1();
    最终JTable table2=getTable2();
    JButton previewButton=新JButton(“打印预览”);
    previewButton.addActionListener(actionEvent->{
    试一试{
    打印预览(getHtml(表1、表2));
    }
    捕获(例外情况除外){
    例如printStackTrace();
    }
    });
    JPanel面板=新的JPanel();
    panel.setLayout(新的BoxLayout(panel,BoxLayout.Y_轴));
    添加(新的JScrollPane(表1));
    添加(新的JScrollPane(表2));
    JFrame=新JFrame(“表格打印演示”);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    添加(面板、边框布局、中心);
    添加(预览按钮,BorderLayout.SOUTH);
    帧设置位置(200100);
    框架。设置尺寸(500500);
    frame.setVisible(true);
    }
    私有JTable getTable1(){
    字符串数据[][]={{“紫罗兰色”、“靛蓝色”},
    {“蓝色”、“绿色”},
    {“黄色”、“橙色”},
    {“红色”、“其他”};
    字符串头[]={“颜色1”,“颜色2”};
    返回新的JTable(数据、标题);
    }
    私有JTable getTable2(){
    TableModel模型=新的AbstractTableModel(){
    @重写公共int getColumnCount(){
    返回2;
    }
    @重写公共int getRowCount(){
    返回10;
    }
    @重写公共对象getValueAt(int行,int列){
    返回(“行“+(行+1)+”列“+(列+1)”处的单元格);
    }
    };
    返回新的JTable(模型);
    }
    私有字符串getHtml(JTable table1、JTable table2){
    String style=“table,th,td{border:1px solid#c0;”+
    “字体系列:无衬线;填充:2px;}”;
    StringBuilder行=新的StringBuilder();
    行。追加(“”)
    .append(“”)。append(样式)。append(“”)
    .附加(“”);
    line=getTableHtml(表1,第行);
    line=getTableHtml(表2,第行);
    行。追加(“”)。追加(“”);
    返回行.toString();
    }
    私有StringBuilder getTableHtml(JTable表,StringBuilder行){
    TableModel模型=table.getModel();
    行。追加(“”);
    行。追加(“”);
    对于(int j=0;j);
    回流线;
    }
    公共void打印预览(字符串html){
    JDialog dialog=新建JDialog();
    对话框.setTitle(“表格打印预览”);
    dialog.setModal(true);
    JEditorPane editorPane=新的JEditorPane(“text/html”,html);
    editorPane.setMargin(新插图(10,10,10,10));
    editorPane.setEditable(false);
    JButton printButton=新JButton(“打印…”);
    printButton.addActionListener(actionEvent->{
    MessageFormat hd=新的MessageFormat(“颜色和内容”);
    MessageFormat ft=新的MessageFormat(“第{0页,数字,整数}”);
    试一试{
    editorPane.print(高清、红外);
    }捕获(例外情况除外){
    例如printStackTrace();
    }
    });
    setDefaultCloseOperation(WindowConstants.DISPOSE\u ON\u CLOSE);
    JPanel面板=新的JPanel();
    添加(新的JScrollPane(editorPane));
    添加(新的JSepator(SwingConstants.VERTICAL));
    面板。添加(打印按钮);
    对话框。添加(面板);
    对话框。设置大小(500700);
    对话框。设置位置(300,50);
    对话框.setVisible(true);
    }
    }
    
    请提供更多详细信息。你尝试了什么?我已经更新了帖子,打印不是一个简单的任务/主题,
    JTable
    是其中一个更复杂的组件,你正在将复杂的任务组合在一起。你需要克服一些可能的问题,比如,当没有问题时会发生什么