当前位置:编程学习 > JAVA >>

java swing中jtable不能打印全部内容,100分!求帮助!

java swing中jtable打印问题,现在需要打印jtable内容,由于将jtable放到了jpanel中,所以用print方法只能打印部分jtable数据,剩下的滚动条下的数据就不能被打印出来了。因为还有在jtable的表头和结尾加上标注,就不能直接用jtablemodel打印了。

现在希望实现,头尾保持不动,中间的jtable数据能全部打印出来,能分页打印出来,但是每页打印出来的都能包含头尾标注

如图
jtable swing java 打印 --------------------编程问答-------------------- 这个问题昨天有个人问到了。。。
你参考下,滚动条应该是可以实现的。。
至于你说的不懂的那些,既然你用的是JPanel,你可以额外在JPanel上添加一个JLabel来显示那些不动的信息 --------------------编程问答--------------------
引用 1 楼 AA5279AA 的回复:
这个问题昨天有个人问到了。。。
你参考下,滚动条应该是可以实现的。。
至于你说的不懂的那些,既然你用的是JPanel,你可以额外在JPanel上添加一个JLabel来显示那些不动的信息



那个滚动条是实现的,问题在于jtable中数据的全部显示,比如数据有20条,第一页显示15条,第二页就显示5条,想要实现的是自己分页打印的功能 --------------------编程问答-------------------- 分页与不分页区别其实不是很大,只是多传两个参数,少取数据 --------------------编程问答--------------------
引用 3 楼 udbwcso 的回复:
分页与不分页区别其实不是很大,只是多传两个参数,少取数据


这个应该怎么解决,因为是打印整个jpanel,所以滚动条不显示的数据就不能被打印出来了 --------------------编程问答-------------------- 这种需求的话,要自己控制打印,没法直接使用控件打印。 --------------------编程问答--------------------
引用 5 楼 ldh911 的回复:
这种需求的话,要自己控制打印,没法直接使用控件打印。


我后来想了种方法,就是根据表格数据来控制页数,然后在打印时remove中间jpanel中的表格,重新做一个限定行数的表格,可以每次remove后,表格就加不进去了,就是把中间的jpanel重新add(jtable),结果打印出来中间就是空白的,求指导 --------------------编程问答--------------------
引用 6 楼 mc_mong 的回复:
Quote: 引用 5 楼 ldh911 的回复:

这种需求的话,要自己控制打印,没法直接使用控件打印。


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


刷新下jpanel试试:

new JPanel().updateUI();
new JPanel().repaint();
--------------------编程问答-------------------- new JPanel().updateUI();
new JPanel().repaint(); --------------------编程问答--------------------
引用 7 楼 huxiweng 的回复:
Quote: 引用 6 楼 mc_mong 的回复:

Quote: 引用 5 楼 ldh911 的回复:

这种需求的话,要自己控制打印,没法直接使用控件打印。


我后来想了种方法,就是根据表格数据来控制页数,然后在打印时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 楼 careers1111 的回复:
new JPanel().updateUI();
new JPanel().repaint();


也还是不行,或者还有没有别的方法啊,求指导 --------------------编程问答--------------------
引用 9 楼 mc_mong 的回复:
Quote: 引用 7 楼 huxiweng 的回复:

Quote: 引用 6 楼 mc_mong 的回复:

Quote: 引用 5 楼 ldh911 的回复:

这种需求的话,要自己控制打印,没法直接使用控件打印。


我后来想了种方法,就是根据表格数据来控制页数,然后在打印时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里面有数据吗?没数据是看不出来的! --------------------编程问答--------------------
引用 11 楼 huxiweng 的回复:
Quote: 引用 9 楼 mc_mong 的回复:

Quote: 引用 7 楼 huxiweng 的回复:

Quote: 引用 6 楼 mc_mong 的回复:

Quote: 引用 5 楼 ldh911 的回复:

这种需求的话,要自己控制打印,没法直接使用控件打印。


我后来想了种方法,就是根据表格数据来控制页数,然后在打印时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 --------------------编程问答--------------------
引用 12 楼 mc_mong 的回复:
Quote: 引用 11 楼 huxiweng 的回复:

Quote: 引用 9 楼 mc_mong 的回复:

Quote: 引用 7 楼 huxiweng 的回复:

Quote: 引用 6 楼 mc_mong 的回复:

Quote: 引用 5 楼 ldh911 的回复:

这种需求的话,要自己控制打印,没法直接使用控件打印。


我后来想了种方法,就是根据表格数据来控制页数,然后在打印时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


table 的 size也有吗?

你这样代码比较少,比较难定位问题。。一步一步检查 --------------------编程问答-------------------- 我的意思是table设置 宽和高了没 --------------------编程问答--------------------
引用 14 楼 huxiweng 的回复:
我的意思是table设置 宽和高了没


哥你帮我看看代码:
这个是调用打印:

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

--------------------编程问答--------------------
引用 14 楼 huxiweng 的回复:
我的意思是table设置 宽和高了没



我这个的做法就是:现在设置jtable每页打印两条数据,所以在数据库中分页查询每页两条显示,然后想通过页面上输入的数据数来得到总页数,然后在第一页打印调用,第二页打印调用,但是这样一直实现不了。

还有一种设想就是,将得到的jtable数据进行截取取出。比如,我页面上得到5条数据,我设置每页显示2条,然后当进入第一页打印的时候就取jtable中前面两条数据放到new jtable中,打印出来,第二页就取3,4条数据,再打印出来,以此类推,但是不知道怎么实现复制jtable数据到另一个jtable 中 --------------------编程问答--------------------
引用 14 楼 huxiweng 的回复:
我的意思是table设置 宽和高了没

你好,我后来发现是由于没有设置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中的代码,希望得到你的帮助
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,