【问题标题】:how to print selected rows JTable如何打印选定的行JTable
【发布时间】:2014-12-22 05:47:53
【问题描述】:

我尝试使用 Main JTable 的选定行以及相同的头部和单元格渲染来做一个临时 JTable,但是当我尝试打印它时,我只得到一个带有线条边框的空矩形,我在 How to print out specific rows/columns of a JTable? 中看到了另一个使用矩形和单元格边界的方式,但我不明白,我需要一些帮助以使其更清晰

【问题讨论】:

  • 我假设您的意思是,您创建了第二个JTable,其中包含来自主JTable 的选定行的TableModel...
  • 是的,它不起作用

标签: java swing printing jtable


【解决方案1】:

对我来说似乎工作正常......

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 java.util.logging.Level;
import java.util.logging.Logger;
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);
            }
        });
    }

}

【讨论】:

  • 您的示例运行良好,我会检查我的问题是什么,非常感谢。
  • 我“怀疑”表格在打印之前需要调整大小,但这只是我脑海中的想法
  • 是的,大小差不多,但现在我有另一个问题,toPrint JTable 的可打印版本与可打印的主表不同,所有列的宽度都小得多,我试过了用每列的宽度设置 setPreferredWidth,但它仍然给我小列
  • 看看为什么证明您的问题的runnable example 如此重要...GUI 中表格的列宽是如何确定的?
  • 好的,顺便说一句,我正在尝试使用preferredWidth,但我将其更改为setWidth 并且工作正常,感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多