java swing中jtable不能打印全部内容,100分!求帮助!
java swing中jtable打印问题,现在需要打印jtable内容,由于将jtable放到了jpanel中,所以用print方法只能打印部分jtable数据,剩下的滚动条下的数据就不能被打印出来了。因为还有在jtable的表头和结尾加上标注,就不能直接用jtablemodel打印了。现在希望实现,头尾保持不动,中间的jtable数据能全部打印出来,能分页打印出来,但是每页打印出来的都能包含头尾标注
如图
jtable swing java 打印 --------------------编程问答-------------------- 这个问题昨天有个人问到了。。。
你参考下,滚动条应该是可以实现的。。
至于你说的不懂的那些,既然你用的是JPanel,你可以额外在JPanel上添加一个JLabel来显示那些不动的信息 --------------------编程问答--------------------
那个滚动条是实现的,问题在于jtable中数据的全部显示,比如数据有20条,第一页显示15条,第二页就显示5条,想要实现的是自己分页打印的功能 --------------------编程问答-------------------- 分页与不分页区别其实不是很大,只是多传两个参数,少取数据 --------------------编程问答--------------------
这个应该怎么解决,因为是打印整个jpanel,所以滚动条不显示的数据就不能被打印出来了 --------------------编程问答-------------------- 这种需求的话,要自己控制打印,没法直接使用控件打印。 --------------------编程问答--------------------
我后来想了种方法,就是根据表格数据来控制页数,然后在打印时remove中间jpanel中的表格,重新做一个限定行数的表格,可以每次remove后,表格就加不进去了,就是把中间的jpanel重新add(jtable),结果打印出来中间就是空白的,求指导 --------------------编程问答--------------------
刷新下jpanel试试:
--------------------编程问答-------------------- new JPanel().updateUI();
new JPanel().updateUI();
new JPanel().repaint();
new JPanel().repaint(); --------------------编程问答--------------------
这种需求的话,要自己控制打印,没法直接使用控件打印。
我后来想了种方法,就是根据表格数据来控制页数,然后在打印时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();
new JPanel().updateUI();
new JPanel().repaint();
也还是不行,或者还有没有别的方法啊,求指导 --------------------编程问答--------------------
这种需求的话,要自己控制打印,没法直接使用控件打印。
我后来想了种方法,就是根据表格数据来控制页数,然后在打印时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里面有数据吗?没数据是看不出来的! --------------------编程问答--------------------
这种需求的话,要自己控制打印,没法直接使用控件打印。
我后来想了种方法,就是根据表格数据来控制页数,然后在打印时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 --------------------编程问答--------------------
这种需求的话,要自己控制打印,没法直接使用控件打印。
我后来想了种方法,就是根据表格数据来控制页数,然后在打印时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设置 宽和高了没 --------------------编程问答--------------------
我的意思是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;
}
}
我的意思是table设置 宽和高了没
我这个的做法就是:现在设置jtable每页打印两条数据,所以在数据库中分页查询每页两条显示,然后想通过页面上输入的数据数来得到总页数,然后在第一页打印调用,第二页打印调用,但是这样一直实现不了。
还有一种设想就是,将得到的jtable数据进行截取取出。比如,我页面上得到5条数据,我设置每页显示2条,然后当进入第一页打印的时候就取jtable中前面两条数据放到new jtable中,打印出来,第二页就取3,4条数据,再打印出来,以此类推,但是不知道怎么实现复制jtable数据到另一个jtable 中 --------------------编程问答--------------------
我的意思是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