Printing selected rows from JTable

I'm making a java swing application, I'm also a newbie programer (1 and a half years programing).

I'm trying to code inside a button a way to print (in a printer, not in console) the preselected rows (by a user) of a jTable, which has been printed (in the window) by a Query before.

This is my code (inside the button), I know it's worng. I thought , the way to do this was copying in a temp jTable all the selected rows, and then print the temp jTable, but i can't achieve this.

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

To sum up, I just want to print (in a printer) the selected rows of an existing jTable.

I also tryed this -> (how to print selected rows JTable) and other possible solutions, but I can't make them work for me.

Upvotes: 0

Views: 2317

Answers (1)

MadProgrammer
MadProgrammer

Reputation: 347332

You kind of missed the "real important" "trickery" part...

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

It's really, really important that you set the size of the table and header

Updated

If you had basically copied the code from how to print selected rows JTable it would have basically worked

Change...

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

to

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

It prints the exact number of selected rows, but without the data. –

So, I basically went back to how to print selected rows JTable, updated it to fix the "minor" bug so it would only print the selected rows, and run it without an issue...

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

}

What I would recommend is that you start testing your code and make sure that the table is actually adding the rows you expect to the printModel

Upvotes: 3

Related Questions