java swing中jtable打印问题,现在需要打印jtable内容,由于将jtable放到了jpanel中,所以用print方法只能打印部分jtable数据,剩下的滚动条下的数据就不能被打印出来了。因为还有在jtable的表头和结尾加上标注,就不能直接用jtablemodel打印了。现在希望实现,头尾保持不动,中间的jtable数据能全部打印出来,能分页打印出来,但是每页打印出来的都能包含头尾标注如图
jtableswingjava打印

解决方案 »

  1.   

    这个问题昨天有个人问到了
    你参考下,滚动条应该是可以实现的。。
    至于你说的不懂的那些,既然你用的是JPanel,你可以额外在JPanel上添加一个JLabel来显示那些不动的信息
      

  2.   

    那个滚动条是实现的,问题在于jtable中数据的全部显示,比如数据有20条,第一页显示15条,第二页就显示5条,想要实现的是自己分页打印的功能
      

  3.   


    这个应该怎么解决,因为是打印整个jpanel,所以滚动条不显示的数据就不能被打印出来了
      

  4.   


    我后来想了种方法,就是根据表格数据来控制页数,然后在打印时remove中间jpanel中的表格,重新做一个限定行数的表格,可以每次remove后,表格就加不进去了,就是把中间的jpanel重新add(jtable),结果打印出来中间就是空白的,求指导
      

  5.   


    我后来想了种方法,就是根据表格数据来控制页数,然后在打印时remove中间jpanel中的表格,重新做一个限定行数的表格,可以每次remove后,表格就加不进去了,就是把中间的jpanel重新add(jtable),结果打印出来中间就是空白的,求指导刷新下jpanel试试:new JPanel().updateUI();
    new JPanel().repaint();
      

  6.   

    new JPanel().updateUI();
    new JPanel().repaint();
      

  7.   


    我后来想了种方法,就是根据表格数据来控制页数,然后在打印时remove中间jpanel中的表格,重新做一个限定行数的表格,可以每次remove后,表格就加不进去了,就是把中间的jpanel重新add(jtable),结果打印出来中间就是空白的,求指导刷新下jpanel试试:new JPanel().updateUI();
    new JPanel().repaint();
    还是不行啊哥,只要我remove了,就添加不进去了panel_center.removeAll();
     MTable ab = new MTable(leftTableModel);
     panel_center.add(ab);

    panel_center.updateUI();
     panel_center.repaint();
      

  8.   


    我后来想了种方法,就是根据表格数据来控制页数,然后在打印时remove中间jpanel中的表格,重新做一个限定行数的表格,可以每次remove后,表格就加不进去了,就是把中间的jpanel重新add(jtable),结果打印出来中间就是空白的,求指导刷新下jpanel试试:new JPanel().updateUI();
    new JPanel().repaint();
    还是不行啊哥,只要我remove了,就添加不进去了panel_center.removeAll();
     MTable ab = new MTable(leftTableModel);
     panel_center.add(ab);

    panel_center.updateUI();
     panel_center.repaint();MTable ab = new MTable(leftTableModel);
     panel_center.add(ab);你这个table ab里面有数据吗?没数据是看不出来的!
      

  9.   


    我后来想了种方法,就是根据表格数据来控制页数,然后在打印时remove中间jpanel中的表格,重新做一个限定行数的表格,可以每次remove后,表格就加不进去了,就是把中间的jpanel重新add(jtable),结果打印出来中间就是空白的,求指导刷新下jpanel试试:new JPanel().updateUI();
    new JPanel().repaint();
    还是不行啊哥,只要我remove了,就添加不进去了panel_center.removeAll();
     MTable ab = new MTable(leftTableModel);
     panel_center.add(ab);

    panel_center.updateUI();
     panel_center.repaint();MTable ab = new MTable(leftTableModel);
     panel_center.add(ab);你这个table ab里面有数据吗?没数据是看不出来的!
    里面是有数据的
     MTable ab = new MTable(leftTableModel);
     System.out.println("ab的数据--"+ab.getRowCount());
     panel_center.add(ab);
    控制台:ab的数据--1
      

  10.   


    我后来想了种方法,就是根据表格数据来控制页数,然后在打印时remove中间jpanel中的表格,重新做一个限定行数的表格,可以每次remove后,表格就加不进去了,就是把中间的jpanel重新add(jtable),结果打印出来中间就是空白的,求指导刷新下jpanel试试:new JPanel().updateUI();
    new JPanel().repaint();
    还是不行啊哥,只要我remove了,就添加不进去了panel_center.removeAll();
     MTable ab = new MTable(leftTableModel);
     panel_center.add(ab);

    panel_center.updateUI();
     panel_center.repaint();MTable ab = new MTable(leftTableModel);
     panel_center.add(ab);你这个table ab里面有数据吗?没数据是看不出来的!
    里面是有数据的
     MTable ab = new MTable(leftTableModel);
     System.out.println("ab的数据--"+ab.getRowCount());
     panel_center.add(ab);
    控制台:ab的数据--1table 的 size也有吗?你这样代码比较少,比较难定位问题。。一步一步检查
      

  11.   

    我的意思是table设置 宽和高了没
      

  12.   


    哥你帮我看看代码:
    这个是调用打印:  ActionListener printAction = new ActionListener() {  
              public void actionPerformed(ActionEvent e) {  
               
               PrinterJob pj = PrinterJob.getPrinterJob(); 
               pj.setJobName(" Print Component "); 
             //  PageFormat pageFormat = pj.defaultPage(); //获取默认打印页面格式 
               
               pj.setPrintable(new Printable() {

    @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
    throws PrinterException {
    // TODO Auto-generated method stub
    double total=0.0;
    double num=0.0;
    total = show_table.getRowCount();
    num = 2;
    int page = (int)Math.ceil(total/num);
    //System.out.println("进来了--"+page+"--pageIndex--"+pageIndex);

    if (pageIndex >=page){ return Printable.NO_SUCH_PAGE;} 
               Graphics2D g2 = (Graphics2D) graphics; 
               g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); 
               //ContentPanel.paint(g2); 
    //            ContentPanel.printAll(g2);
              
              
               drawdata(g2,pageFormat,page,pageIndex);
              
              
     
               return Printable.PAGE_EXISTS; 
    }
    }); 
              
               if (pj.printDialog() == false) 
               return; 
                try {  
                 pj.print(); 
    //              print_table.print(JTable.PrintMode.FIT_WIDTH);  
                 //print_table.pri              QuotationDialog.this.setVisible(false);
                } catch (PrinterException pe) {  
                  System.err.println("Error printing: " + pe.getMessage());  
                }  
              }  
            };  
            button_print.addActionListener(printAction);  下面是调用drawdata(g2,pageFormat,page,pageIndex)方法:public void drawdata(Graphics2D g2, PageFormat pf, int pg,int pageIndex){
    //System.out.println("page页数第--"+pageIndex+"--页");
    int temp_total = show_table.getRowCount();
    int print_num = pageIndex+1;
    System.out.println("print_num--"+print_num);

    panel_center.removeAll();
    if(print_num==1){
    // System.out.println("第1页打印--quotation_id--"+quotation_id); 

    DefaultTableModel page1TableModel = MyTable.getTable(48, 1, 2);
    MTable temp_table1 = new MTable(page1TableModel);

    temp_table1.updateUI();
    temp_table1.repaint();
    panel_center.add(temp_table1);
     panel_center.updateUI();
     panel_center.repaint();
    }
    else if(print_num==2){
    //System.out.println("第2页打印--quotation_id--"+quotation_id); 

    DefaultTableModel page2TableModel = MyTable.getTable(48, 2, 2);
    MTable temp_table2 = new MTable(page2TableModel);
    temp_table2.updateUI();
    temp_table2.repaint();

    panel_center.add(temp_table2);

     panel_center.updateUI();
     panel_center.repaint();

    // System.out.println("第二页中--"+temp_table2.getRowCount());
    }
    else{
    System.out.println("333333333333333333333333");
    }

    //        MTable op = new MTable(printTableModel);
    //        op.setBackground(Color.WHITE);
    //        op.setColumnSelectionAllowed(false);
    //        op.setRowSelectionAllowed(true);
    //        op.getColumnModel().getColumn(5).setPreferredWidth(500);
    //        op.getColumnModel().getColumn(0).setPreferredWidth(60);
    //        op.getColumnModel().getColumn(1).setPreferredWidth(120);
    //        op.getColumnModel().getColumn(2).setPreferredWidth(230);
    //        op.getColumnModel().getColumn(3).setPreferredWidth(60);
    //        op.getColumnModel().getColumn(4).setPreferredWidth(110);
    //        op.setFont(new Font("Courier New", Font.PLAIN, 11));
    //        op.getTableHeader().setFont(new Font("Courier New", Font.PLAIN, 11));
    //  
    //  //设置jtable价格居右
    //  TableColumn column=op.getColumnModel().getColumn(4);//获取某一列名字  
    //  DefaultTableCellRenderer render = new DefaultTableCellRenderer();//设置监听器  
    //  render.setHorizontalAlignment(SwingConstants.RIGHT);//价格右对齐  
    //  column.setCellRenderer(render);  
    //  
    //        final JScrollPane leftScrollPane = new JScrollPane();
    //        leftScrollPane.getViewport().setBackground(Color.WHITE); //设置无数据部分的背景色 
    //        panel_center.add(op);
    //        leftScrollPane.setViewportView(op);
    //  
    //        op.setPreferredScrollableViewportSize(new Dimension(780, 420));
    //  panel_center.setVisible(true);

    //leftTableModel.removeRow(1);
    panel_center.removeAll();
     MTable ab = new MTable(leftTableModel);
     System.out.println("ab的数据--"+ab.getRowCount());
     panel_center.add(ab);

     System.out.println("-------------------------------------------------");
     
     panel_center.updateUI();
     panel_center.repaint();
     
            ContentPanel.add(panel_center,BorderLayout.CENTER);
            ContentPanel.updateUI();
            ContentPanel.repaint();
     
            ContentPanel.paint(g2); 



    };
    其中MyTable.getTable(48, 2, 2);这个方法是通过id来分页显示数据,用来第一页第二页打印:public class MyTable {
    private static DefaultTableModel table=null;
    public static DefaultTableModel getTable(int id,int pageno, int pagesize){   //String sql是一条select语句
    PreparedStatement ps= null;
    ResultSet rs = null;
    System.out.println("数据库中--pageno--"+pageno+"--pagesize--"+pagesize+"--id--"+id+"----------------------------");

    if(table==null){
    try {
    try {
    Connection conn = DBConn.getConnection();
    // String sql1 = "select a.inv_code 条形码,b.inv_name_cn 品名,price_selling 价格,b.inv_keyword_cn 关键字 " +
    // "from t_quotation_item a,t_inventory b where a.inv_id=b.inv_id and quotation_id=?";
    String sql1 = "select t2.* from (select rownum r,t1.* from (" +
    "select a.inv_code 条形码,b.inv_name_cn 品名,b.unit_en 单位,price_selling 价格,b.inv_summary_en 备注 from t_quotation_item a,t_inventory b where a.inv_id=b.inv_id and item_status !=20 and quotation_id=? order by a.inv_id) t1 " +
    "where rownum<="+pageno*pagesize +") t2 where t2.r>"+(pageno-1)*pagesize;

    ps = conn.prepareStatement(sql1);
    ps.setInt(1, id);
    rs = ps.executeQuery();
    Vector heads=new Vector();
    ResultSetMetaData rsmd=rs.getMetaData();
    int count=rsmd.getColumnCount();               //获得表的列数
    for(int i=1;i<=count;i++){                               //获得表头,存于Vector heads中
    heads.add(rsmd.getColumnLabel(i));
    }
    //heads.add("操作");
    table=new DefaultTableModel(null,heads);   //把表头添加到表中
    table.setRowCount(0);
    while(rs.next()){                                               //获得表每行的内容,并添加到表中 
    Vector row=new Vector();
    for(int i=1;i<=count;i++)     
    row.add(rs.getString(i));
    row.add("yes");
    table.addRow(row);
    }
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } catch (Exception e) {
    }
    }
    //System.out.println("数据库中--"+table.getRowCount());
    return table;
    }
    }
      

  13.   

    我这个的做法就是:现在设置jtable每页打印两条数据,所以在数据库中分页查询每页两条显示,然后想通过页面上输入的数据数来得到总页数,然后在第一页打印调用,第二页打印调用,但是这样一直实现不了。还有一种设想就是,将得到的jtable数据进行截取取出。比如,我页面上得到5条数据,我设置每页显示2条,然后当进入第一页打印的时候就取jtable中前面两条数据放到new jtable中,打印出来,第二页就取3,4条数据,再打印出来,以此类推,但是不知道怎么实现复制jtable数据到另一个jtable 中
      

  14.   

    你好,我后来发现是由于没有设置temp_table2.setBounds(10, 40,740,380);
    表格就不显示了,这样表格显示了,但是表格的表头不能被打印出来了,能帮我看看吗,非常感谢import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.util.Vector;import javax.swing.table.DefaultTableModel;public class MyyTable {
    private static DefaultTableModel table=null;
    private static Vector<Vector<Object>> tempvalue;
    public static DefaultTableModel getTable(int id,int pageno, int pagesize){   //String sql是一条select语句
    PreparedStatement ps= null;
    ResultSet rs = null;
    System.out.println("数据库中--pageno--"+pageno+"--pagesize--"+pagesize+"--id--"+id+"----------------------------");

    if(table==null){
    try {
    try {
    Connection conn = DBConn.getConnection();
    // String sql1 = "select a.inv_code 条形码,b.inv_name_cn 品名,price_selling 价格,b.inv_keyword_cn 关键字 " +
    // "from t_quotation_item a,t_inventory b where a.inv_id=b.inv_id and quotation_id=?";

    String sql1 = "select t2.* from (select rownum as SN,t1.* from (" +
    "select a.inv_code as Part_No,b.inv_name_cn as Part_Name,b.unit_en as Unit,price_selling as Unit_Price,b.inv_summary_en as Summary from t_quotation_item a,t_inventory b where a.inv_id=b.inv_id and item_status !=20 and quotation_id=? order by a.inv_id) t1 " +
    "where rownum<="+pageno*pagesize +") t2 where t2.SN>"+(pageno-1)*pagesize;

    ps = conn.prepareStatement(sql1);
    ps.setInt(1, id);
    rs = ps.executeQuery();
    // Vector heads=new Vector();

    Vector<String> heads = new Vector<String>();
    ResultSetMetaData rsmd=rs.getMetaData();
    int count=rsmd.getColumnCount();                //获得表的列数

    // for(int i=1;i<=count;i++){                           //获得表头,存于Vector heads中
    // heads.add(rsmd.getColumnLabel(i));
    // }
    String leftTableColumns[] = { "SN","Part No.","Part Name","Unit","Unit Price","Summary"};
            for (int i = 0; i < leftTableColumns.length; i++) {
             heads.add(leftTableColumns[i]);
            }
    // heads.add("操作");
    table=new DefaultTableModel(null,heads);    //把表头添加到表中
    table.setRowCount(0);
    while(rs.next()){                                   //获得表每行的内容,并添加到表中 
    Vector row=new Vector();
    for(int i=1;i<=count;i++){
    row.add(rs.getString(1));
    row.add(rs.getString(2));
    row.add(rs.getString(3));
    row.add(rs.getString(4));
    row.add(rs.getDouble(5));
    row.add(rs.getString(6));
    }
    table.addRow(row);
    }


    //以下是显示数据库中的列名的代码


    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } catch (Exception e) {
    }
    }
    //System.out.println("数据库中--"+table.getRowCount());
    return table;
    }
    }这个是我读取数据库信息放到jtable中的代码,希望得到你的帮助