从JTable打印选定的行

我正在制作一个java swing应用程序,我也是一个新手程序员(1年半的编程)。

我试图在一个按钮内部编码一种方式来打印(在打印机中,而不是在控制台中)jTable的预选行(由用户),该jTable之前已通过Query打印(在窗口中)。

这是我的代码(在按钮内),我知道这是故事。 我想,这样做的方法是在一个临时jTable中复制所有选中的行,然后打印temp jTable,但我无法实现这一点。

MessageFormat header = new MessageFormat("- {TABLE} -"); try { DefaultTableModel viewModel = (DefaultTableModel) jTable.getModel(); DefaultTableModel printModel = new DefaultTableModel(viewModel.getRowCount(), viewModel.getColumnCount()); JTable toPrint = new JTable(printModel); int[] selectedRows = jTable.getSelectedRows(); for (int r=0;r<selectedRows.length;r++){ toPrint.addRowSelectionInterval(r, r); } toPrint.print(JTable.PrintMode.FIT_WIDTH,header,null); } catch (java.awt.print.PrinterException e1) { System.err.format("Cannot print %s%n", e1.getMessage()); } 

总而言之,我只想打印(在打印机中)现有jTable的选定行。

我也试过这个 – >( 如何打印选定的行JTable )和其他可能的解决方案,但我不能让它们为我工作。

你有点错过了“真正重要的”“诡计”部分……

 JTable toPrint = new JTable(printModel); toPrint.setSize(toPrint.getPreferredSize()); JTableHeader tableHeader = toPrint.getTableHeader(); tableHeader.setSize(tableHeader.getPreferredSize()); toPrint.print(JTable.PrintMode.FIT_WIDTH); 

设置表格和标题的大小真的非常重要

更新

如果您基本上已经复制了如何打印选定行JTable的代码,它基本上可以工作

更改…

 DefaultTableModel viewModel = (DefaultTableModel) jTable.getModel(); DefaultTableModel printModel = new DefaultTableModel(viewModel.getRowCount(), viewModel.getColumnCount()); JTable toPrint = new JTable(printModel); int[] selectedRows = jTable.getSelectedRows(); for (int r=0;r 

 DefaultTableModel viewModel = (DefaultTableModel) jTable.getModel(); DefaultTableModel printModel = new DefaultTableModel(0, viewModel.getColumnCount()); JTable toPrint = new JTable(printModel); for (int row : table.getSelectedRows()) { printModel.addRow((Vector)viewModel.getDataVector().get(row)); } 

它打印所选行的确切数量,但没有数据。 -

所以,我基本上回到了如何打印选定行JTable ,更新它以修复“次要”错误,因此它只打印选定的行,并运行它没有问题...

 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.print.PrinterException; import java.util.Vector; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.table.DefaultTableModel; import javax.swing.table.JTableHeader; public class TestPrint { public static void main(String[] args) { new TestPrint(); } public TestPrint() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } DefaultTableModel model = new DefaultTableModel(0, 26); for (int row = 0; row < 26; row++) { Vector data = new Vector(26); for (int col = 0; col < 26; col++) { String value = row + "x" + ((char) (col + 'A')); data.add(value); } model.addRow(data); } JTable table = new JTable(model); JButton print = new JButton("Print"); print.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { DefaultTableModel viewModel = (DefaultTableModel) table.getModel(); DefaultTableModel printModel = new DefaultTableModel(0, viewModel.getColumnCount()); for (int row : table.getSelectedRows()) { printModel.addRow((Vector) viewModel.getDataVector().get(row)); } JTable toPrint = new JTable(printModel); toPrint.setSize(toPrint.getPreferredSize()); JTableHeader tableHeader = toPrint.getTableHeader(); tableHeader.setSize(tableHeader.getPreferredSize()); toPrint.print(JTable.PrintMode.FIT_WIDTH); } catch (PrinterException ex) { ex.printStackTrace(); } } }); JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new JScrollPane(table)); frame.add(print, BorderLayout.SOUTH); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } } 

我建议您开始测试代码并确保表实际上是将您期望的行添加到printModel