从JTable打印选定的行 [英] Printing selected rows from JTable

查看:67
本文介绍了从JTable打印选定的行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

我正在尝试编写内部代码一个按钮一种打印(在打印机中,而不是在控制台中)jTable的预选行(由用户)的方法,该行已经通过查询打印(在窗口中)。

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.

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

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

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

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

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

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

推荐答案

你错过了真正重要的诡计部分...

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

已更新

如果基本上已从如何打印选定的行JTable 它基本上可以工作

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

更改...

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

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. –

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

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

}

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

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

这篇关于从JTable打印选定的行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆