java - 打印 JTable 中选定的行

标签 java swing printing jtable

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

我正在尝试在按钮内编写一种方法来打印(在打印机中,而不是在控制台中)jTable 的预选行(由用户),该行之前已由查询打印(在窗口中) .

这是我的代码(在按钮内),我知道它已经磨损了。我认为,执行此操作的方法是将所有选定的行复制到临时 jTable 中,然后打印临时 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 的选定行。

我也尝试过这个 -> ( how to print selected rows JTable ) 和其他可能的解决方案,但我无法让它们为我工作。

最佳答案

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

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

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

已更新

如果您基本上复制了 how to print selected rows 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<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. –

所以,我基本上回到了 how to print selected rows 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

关于java - 打印 JTable 中选定的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34742195/

相关文章:

Python 在单独的行上打印列表

java - LayoutParams 上的 ClassCastException 从 LinearLayout 到 AbsListView

java - BorderLayout - 两个组件中只有一个出现在 SOUTH 中

html - 有没有办法将 css 文件附加到 jEditorPane?

c# - 如何在 C# 中使用 PrintDialog 打印文档

.NET 查找纸盒尺寸

java - 从 WSDL 创建 Java API

java - 将 Shrinksafe 与 IBM JRE 结合使用时出现 MalformedInputException

java - winrun4j 自动检测 JVM

java - JTable:从右到左对齐组件